char * names[3];
Это не двумерный массив, это массив из трех указателей на char
, если вы хотите сохранить в нем char arrays
, вы должны выделить память для каждого отдельного указателя, что-то вроде:
for(size_t i = 0; i < 3; i++){
names[i] = malloc(/*length your array of chars*/);
}
Затем вы можете сохранить char arrays
, используя пример:
for(size_t i = 0; i < 3; i++){
printf("Enter name %ld: ", i + 1 );
scanf("%29s", names[i]); //for a malloc size of 30
}
Обратите внимание, что вы должны быть осторожны с scanf
, если введенная строка длиннее, чем память, выделенная для ее хранения, вы будет иметь разрушение стека, т.е. для names[i]
с размером 30
, вы должны использовать спецификатор %29s
вместо %s
. Хотя этот подход не исключает проблем, а именно возможных символов, оставленных в буфере stdin
, он определенно безопаснее.
В качестве альтернативы вы можете назначать им строковые литералы (в этом случае лучше всего объявить массив как const
иначе, если вы попытаетесь отредактировать один или несколько символов, это приведет к segfault):
const char* names[3];
for(size_t i = 0; i < 3; i++){
names[i] = "My string literal";
}
Вы также можете сделать так, чтобы они указывали на существующие char arrays
:
char arr[3][10];
char* names[3];
for(size_t i = 0; i < 3; i++){
names[i] = arr[i];
}