стека дамп доступа к массиву символов malloc - PullRequest
5 голосов
/ 12 мая 2010

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);
}

Ответы [ 6 ]

5 голосов
/ 12 мая 2010

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

, например

#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 );
}
4 голосов
/ 12 мая 2010

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

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

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

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

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

free(devices[0]);
3 голосов
/ 12 мая 2010

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

2 голосов
/ 12 мая 2010

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

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 */
1 голос
/ 12 мая 2010

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

0 голосов
/ 12 мая 2010

devices - это массив указателей.Вы копируете строку «smxxxx1» поверх массива, когда создается впечатление, что вы хотите установить элемент 0, чтобы он указывал на строку.

Вместо strcpy () try:

devices[0] = "smxxxx1"

или

devices[0] = strdup("smxxxx1")

Редактировать:

В 32-битной системе устройства [0] состоят из четырех байтов.Эти четыре байта перезаписываются байтовыми значениями первых четырех символов строки «smxxxx1».В ascii это 0x73, 0x6D, 0x78, 0x78.Предполагая адресацию little-endian , вы получите устройства [0], содержащие указатель на адрес 0x78786D73.Этот адрес почти наверняка не будет действительным в процессе.Когда вызов printf () пытается разыменовать этот недопустимый указатель, ОС вызывает ошибку сегментации и выдает дамп ядра.

Проблема заключалась в том, что OP неправильно обрабатывал переменную devices как строку (массив char), когдаинициализирую это.На самом деле это массив указателей на char, и printf () интерпретирует его как таковой.

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