gcc 4.4.3 c89
У меня есть следующий исходный код. И получение стека выводит на printf.
char **devices;
devices = malloc(10 * sizeof(char*));
strcpy(devices[0], "smxxxx1");
printf("[ %s ]\n", devices[0]); /* Stack dump trying to print */
Я думаю, что это должно создать массив символов как это.
devices[0]
devices[1]
devices[2]
devices[4]
etc
И каждый элемент я могу сохранить свои строки.
Большое спасибо за любые предложения,
== Добавленное исправление ===
for(i = 0; i < 10; i++)
{
devices[i] = malloc(strlen("smxxxx1")+1);
}
Вы выделили память для массива указателей. Вам необходимо выделить память для каждого элемента для хранения строки
, например.
#define NUM_ELEMENTS 10
char **devices;
devices = malloc(NUM_ELEMENTS * sizeof(char*));
for ( int i = 0; i < NUM_ELEMENTS; i++)
{
devices[i] = malloc( length_of string + 1 );
}
устройства [0] - это char *
, но вы не выделили для него хранилище. Вместо этого сделайте следующее:
char **devices;
devices = malloc(10 * sizeof(char*));
devices[0] = strdup("smxxxx1");
printf("[ %s ]\n", devices[0]);
В конце концов вам придется освободить память, выделенную с помощью strdup ()
:
free(devices[0]);
Вы выделили память для хранения 10 символьных указателей . Чтобы сохранить строку в этих ячейках памяти, вы должны выделить память для каждого из них. Обычно вам нужно что-то вроде device [0] = malloc (stringLen + 1);
для каждого указателя.
Вы выделили только массив указателей на символьные массивы. Вам придется выделить память для каждой строки, которую вы планируете хранить:
char **devices;
devices = malloc(10 * sizeof(char*));
//Added this line:
devices[0] = (char*)malloc(strlen("smxxxx1")+1);
strcpy(devices[0], "smxxxx1\0");
printf("[ %s ]\n", devices[0]); /* Stack dump trying to print */
вы выделили место для указателей (устройств), но не выделили место для строк, которые вы собираетесь хранить.
устройства - это массив указателей. Вы копируете строку "smxxxx1" по массиву, когда похоже, что вы хотите установить элемент 0 для указания на строку.
Вместо strcpy() попробуйте:
devices[0] = "smxxxx1"
или
devices[0] = strdup("smxxxx1")
Edit:
В 32-битной системе устройство[0] состоит из четырех байт. Эти четыре байта перезаписываются байтовыми значениями первых четырех символов строки "smxxxx1". В ascii это 0x73, 0x6D, 0x78, 0x78. Предполагая little-endian адресацию, в итоге вы получите устройство devices[0], содержащее указатель на адрес 0x78786D73. Этот адрес почти наверняка не будет действительным внутри процесса. Когда вызов printf() пытается разыменовать этот недействительный указатель, ОС вызывает ошибку сегментации и сбрасывает ядро.
Проблема заключалась в том, что ОП неправильно рассматривал переменную devices как строку (массив char) при ее инициализации. На самом деле это массив указателей на char, и printf() интерпретирует его как таковой.