2015-10-26 6 views
0

Итак, я писал простую функцию среза в C, которая берет массив строк, строку, которая отмечает начало среза, и размер среза. в функции i malloc новый массив, а затем приступить к копированию по каждой строке в срезе в новый массив. однако, я получаю segfault в самом первом strcpy, хотя я уже malloced пространство для массива результатов.Strcpy segfaults после Malloc

код выглядит следующим образом:

char** slice(char** args, char* start, int size){ 
    int i = 0; 
    // need to find start first 
    char* cursor = args[0]; 
    int j = 0; 
    while(cursor != NULL){ 
    if(strcmp(cursor, start) == 0){ 
     break; 
    } 
    j++; 
    cursor = args[j]; 
    } 
    char** result = malloc(MAX_INPUT * size); 
    while(i < size){ 
    strcpy(result[i], args[j+i]); 
    i++; 
    } 
    return result; 
} 

линия, которая casues в Segfault есть -

strcpy(result[i], args[j+i]); 

я использовал GDB, чтобы заглянуть в значение Что в результате и аргументах, результат [i] равен 0x0, что равно NULL, но результат сам по себе является адресом, но я не уверен, почему malloc не работает. у меня закончилось пространство стека? это означает, что я ввернута?

+0

это вопрос о проблеме времени выполнения, поэтому опубликованный код должен быть скомпилирован, а при запуске отображается проблема. В опубликованном коде отсутствуют инструкции заголовка #include и нет драйвера для функции I.E. нет функции main() и описания описания параметра «args []» и никакого ввода примера. Поскольку проблема, кажется, связана с параметром argss [], код, который устанавливает этот параметр, должен быть опубликован – user3629249

+0

опубликованный код не может проверить (! = NULL) возвращаемое значение, так как вы знаете, что malloc() не удалось? – user3629249

+0

Что такое #define для MAX_INPUT? Как «размер» относится к параметру «args []»? – user3629249

ответ

2

result[i] - неинициализированный указатель. Вы сделали ту же ошибку, как в:

char *ptr; 
strcpy(ptr, args[j+i]); 

Вы должны сделать result[i] точку в какой-то выделенное пространство, прежде чем вы можете скопировать символы в него. Кроме того, MAX_INPUT * size - это неправильный объем пространства для выделения для массива указателей.

Другая проблема заключается в том, что если size больше, чем количество строк, оставшихся в массиве после start, тогда вы читаете конец массива.

Тогда ваша функция никогда не вставляет NULL в конец нового массива, поэтому вызывающий абонент не знает, насколько большой фрагмент, который вы вернули.

Также cursor является избыточным, вы могли бы только что написали args[j]. В основном функция - полный беспорядок.

Код может быть (предупреждение: непроверенные):

char** slice(char** args, char const *start, int slice_size) 
{ 
// Find index of "start" 
    int start_index; 

    for (start_index = 0; args[start_index]; ++start_index) 
     if (!strcmp(args[start_index], start)) 
       break; 

// Abort if "start" was not present (remove this line if you want to 
// instead return an empty terminated list) 
    if (!args[start_index]) 
     return NULL; 

// Allocate array of pointers to new strings, allowing space for terminator 
    char **result = malloc((slice_size + 1) * sizeof *result); 
    if (!result) 
     return NULL; 

// Copy strings in, allocating space for each string, stopping if no more args 
    int i; 
    for (i = 0; i < slice_size && args[start_index + i]; ++i) 
     result[i] = strdup(args[start_index + i]); 

// Terminate the list 
    result[i] = NULL; 

    return result; 
} 
+0

Спасибо! это сработало. да, я полагаю, что курсор был ненужным. – SwagMasterJesus

0

эта линия:

char** result = malloc(MAX_INPUT * size); 

mallocs MAX_INPUT символов раз размер. В чем смысл содержания «размер».

В целом, необходим malloc для ряда char *, которые я не вижу в коде.

Затем, после получения этого параметра таНоса правильного,

кода должен использовать strdup() вместо strcpy() -или- таНос номера для каждой строки, а затем использовать strcpy(), вероятно, в петле, содержащей как вызовы функции

Смежные вопросы