Возможно ли проверить, что параметром функции является массив символов, константная строка, строковый указатель на данные malloc - PullRequest
2 голосов
/ 04 августа 2011

У меня проблема с проверкой параметров функции.В func (char * str) параметром могут быть три типа строк: 1. константная строка 2. строковый указатель на данные malloc 3. массив символов.Можно ограничить, чтобы функция c принимала только константную строку, например «1111»?

Я пытаюсь написать некоторый код, как показано ниже, но он не работает.

struct test{
    const char *val;
};

void func(struct test *t, const char *rodata)
{
    t->val = rodata;
}

Но я обнаружил, что не могу проверить, какие данные я передаю функции ():

/* Test: rodata don't free after function call, it can be the point to*/
func(t, "333");
printf("%s\n", t->val);

/* Test: C function can't check rw char array, even with const ...*/
char rwdata[] = "22222";
func(t, rwdata);
memset(rwdata, '9', sizeof(rwdata));
printf("%s\n", t->val);

/* Test: C function can't check malloc ?*/
char *rwdata2 = strdup("rodata2");
free(rwdata);
func(t, rwdata2); /* cause error */
printf("%s\n", t->val);
}

Ответы [ 2 ]

5 голосов
/ 04 августа 2011

Нет - все три аргумента являются указателями. Невозможно достоверно различить их.

0 голосов
/ 26 марта 2014

3-я ошибка

Вы могли бы сделать это

typedef struct 
{
   const char* val;

}test;


test func(test t, const char* s)
{
   t.val = s;
   return t;
}


int main()
{
  test t ={0};
  char* p = NULL;

  p= (char*)malloc(4);

  strncpy(p, "abc", 4);


  t = func(t, p);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...