Я пытаюсь проанализировать массив строк 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.
Вы также можете сделать two[0] = one[0]
, который не копирует символы, а устанавливает two[0]
действительный адрес.
@WhozCraig Вы правы, хотя я запустил его в gdb и прочитал справочную страницу strcpy, единственное, что я обнаружил, это то, что место назначения должно быть больше, чем источник. Но я могу сказать, что у меня нет опыта в программировании, так что это тоже играет роль.
@sercantor Отлично, что вы использовали свой отладчик. В будущем любые усилия по отладке, которые вы предприняли, и информация, которую вы узнали/получили к настоящему времени, должны быть частью вашего вопроса. Это важно. Это экономит время людей. В данном случае не так уж и много, поскольку ответ вопиюще прост. Но в более сложном коде это может быть очень полезно. Постарайтесь запомнить это для будущих постов.
@WhozCraig Вы снова правы, вопрос, который я задал, довольно расплывчатый. Я писал интерпретатор/оболочку командной строки, но у меня возникла проблема с анализом строки, поэтому я подумал упростить ее здесь и спросить, но я думаю, что из-за расплывчатости это делает ее еще сложнее. Спасибо за ответ!
Массив two
содержит место для указателей на 32 символа после malloc
.
Однако эти указатели не инициализированы и в данный момент не указывают на допустимую выделенную память.
Таким образом, strcpy
по сути имеет пункт назначения (two[0]
), который является неизвестным, неинициализированным значением. Указатель — это, по сути, значение, хранящееся в памяти. В данном случае ценностью является грабёж.
Запись по мусорному адресу с помощью strcpy
генерирует SEGFAULT из-за нелегального доступа к памяти.
Чтобы решить эту проблему, убедитесь, что место назначения (two[0]
) указывает на законный буфер с возможностью записи (возможно, two[0] = malloc(128 * sizeof(char))
).
Кстати, поищите аналогичную (но более безопасную) функцию strncpy
.
Спасибо за разъяснение, это прекрасно объясняет мой вопрос.
Вам также нужно выделить массив символов для
two[0]
.