присвоение массива строк другому - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь разобрать массив строк C, назначая часть слов одному массиву строк, а другую часть - другому массиву.Но когда я использую функцию strcpy, я получаю segfault.Любая идея, как решить эту проблему?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])  {
    char **one = malloc(16 * sizeof(char*));
    char **two = malloc(32 * sizeof(char*));

    one[0] = "string";

    strcpy(two[0], one[0]);

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

В результате компиляции и запуска этого я получаю segfault.

1 Ответ

2 голосов
/ 27 мая 2019

Массив two содержит пространство для 32 символьных указателей после malloc. Однако эти указатели неинициализированы и не указывают на допустимую выделенную память на этом этапе.

Следовательно, strcpy, по существу, имеет пункт назначения (two[0]), который является неизвестным, неинициализированным значением. Указатель - это значение, хранящееся в памяти. В этом случае значение является мусором.

Запись по адресу мусора с помощью strcpy создает SEGFAULT из-за недопустимого доступа к памяти.

Чтобы решить эту проблему, убедитесь, что пункт назначения (two[0]) указывает на допустимый доступный для записи буфер (возможно, two[0] = malloc(128 * sizeof(char))).

В связанной заметке найдите похожую (но более безопасную) функцию strncpy.

...