-2

Да Я прочитал эти два сообщения.Ошибка компиляции C Объект с переменным размером не может быть инициализирован символом char * ptr [buflen]

C compile error: "Variable-sized object may not be initialized" C error "variable-sized object may not be initialized"

Мой случай немного отличается, потому что я использую char * ptr[buflen]. Это то, что я пробовал:

char *ptr[buflen] = {0}; //This gave me the variable sized object error. 

char *ptr[buflen]; 
memset(ptr, 0, buflen*buflen*sizeof(char)); //I figured this would work with looking at the previous examples. 

//This seemed to work but I am curious if I need to use free or malloc 
after looking at the previous examples. I don't want this to seg fault later 
in the program and have no clue what is causing it. 
char *ptr[buflen]; 
memset(ptr, 0, sizeof ptr); 

char *strings_line_tokens[503] = {0}; //Why does this work but the above won't work? 
+2

'MemSet (ptr, 0, buflen * sizeof (char *)) '. Хотя * технически * NULL-ptr не обязательно должен быть нулевым, поэтому вы должны * вероятно * использовать цикл для инициализации всех указателей. – EOF

+1

'char * ptr [buflen] = {0}' должно быть 'char * ptr [buflen] = {NULL}' –

+0

Что вы собираетесь хранить в 'ptr' Я думаю, вы смущены этим. –

ответ

0

Мой случай немного отличается, потому что я использую символ * PTR [buflen].

Не совсем. Вы объявляете ptr как buflen -размерный массив char *. Если buflen не константа, то ptr является массив переменной длины, и вы не можете использовать инициализатор для массива переменной длины:

6.7.9 Initialization
...
3 Тип объекта, подлежащего инициализации, должен быть массив неизвестного размера или полный тип объекта , который не является массивом переменной длины.

Акцент добавлен.

Так, довольно просто,

char *ptr[buflen] = {0}; 

не является юридической инициализацией.

Если вы хотите, чтобы инициализировать все элементы ptr к 0 или NULL, вы бы использовать memset:

memset(ptr, 0, sizeof *ptr * buflen); // note memset writes 0 to all *bytes* in 
             // in the array 

или вы бы присвоить каждый элемент в цикле:

for (size_t i; i < buflen; i++) 
    ptr[i] = NULL; // or 0, or some other pointer value 
+0

Так что это не делало того, что я ожидал 'memset (ptr, 0, sizeof ptr);'? Это не давало мне предупреждения о компиляторе и не выполняло никаких действий. – rocker

+0

@rocker: bugger. Позвольте мне это исправить. –

+0

@rocker: моя ошибка - эта строка должна быть 'memset (ptr, 0, sizeof * ptr * buflen);'. В последнее время я работал с указателями на массивы и массивы указателей, и мои проводы пересекались. –

Смежные вопросы