сложите дамп, получающий доступ malloc массив символов

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);
}
5
задан sepehr 12 May 2010 в 09:31
поделиться

6 ответов

Вы выделили память для массива указателей. Вам необходимо выделить память для каждого элемента для хранения строки

, например.

#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 );
}
5
ответ дан 18 December 2019 в 11:54
поделиться

устройства [0] - это char * , но вы не выделили для него хранилище. Вместо этого сделайте следующее:

char **devices;
devices = malloc(10 * sizeof(char*));

devices[0] = strdup("smxxxx1");

printf("[ %s ]\n", devices[0]);

В конце концов вам придется освободить память, выделенную с помощью strdup () :

free(devices[0]);
4
ответ дан 18 December 2019 в 11:54
поделиться

Вы выделили память для хранения 10 символьных указателей . Чтобы сохранить строку в этих ячейках памяти, вы должны выделить память для каждого из них. Обычно вам нужно что-то вроде device [0] = malloc (stringLen + 1); для каждого указателя.

3
ответ дан 18 December 2019 в 11:54
поделиться

Вы выделили только массив указателей на символьные массивы. Вам придется выделить память для каждой строки, которую вы планируете хранить:

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 */
2
ответ дан 18 December 2019 в 11:54
поделиться

вы выделили место для указателей (устройств), но не выделили место для строк, которые вы собираетесь хранить.

1
ответ дан 18 December 2019 в 11:54
поделиться

устройства - это массив указателей. Вы копируете строку "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() интерпретирует его как таковой.

0
ответ дан 18 December 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: