2013-10-24 4 views
1

У меня есть программа, которая принимает аргументы без опции (из командной строки) после аргумента параметра (-r, -d и т. Д.) И вставляет каждый аргумент без опции в массив. Максимальное количество необязательных аргументов, которые можно ввести, равно 25.Ошибка шины 10 при работе со строковым массивом - C

Но проблема в том, что при запуске программы появляется ошибка «Ошибка шины 10», и я не уверен, почему. смотрел на столько постов с подобными проблемами, но не могу показаться, чтобы исправить мое

код:.

void loop_namelist(int argc, char *argv[]) 
{ 
int index = 0; 
--optind; 

char *buff_namelist[25]; //the array that the arguments are stored in 
*buff_namelist = malloc(25 * 25); //allocating some memory for the array 

while (optind < argc) //loop until no arguments left 
{ 

    strcpy(buff_namelist[index], argv[optind]); 

    ++index; //move to next index in array 
} 
} 

Когда я бегу это так:

./program -r arg1 arg2 

Я получаю автобус

+0

Compile с 'НКА -Wall -g source.c -o program' (или включить все предупреждения и информацию об отладке в вашем компиляторе) и узнать, как использовать отладчик (например, 'gdb'). Также расскажите, какую операционную систему и компилятор вы используете. –

+1

Вы знаете, что вы выделили место для указателя * first * в вашем указательном массиве? Поэтому, как только 'index' больше 0, это ** неопределенное поведение **. – WhozCraig

+0

Я использую gcc-компилятор и те аргументы, которые вы сказали, но все равно ничего. Я использую MAC OS X. – pudumaster

ответ

1

Добавлены некоторые комментарии ...

char *buff_namelist[25]; //the array that the arguments are stored in 

//you don't need to allocate memory for array, but in this case you need to allocate 
//memory for each element in array better to do that in for loop 
*buff_namelist = malloc(25 * 25); //allocating some memory for the array 

while (optind < argc) //loop until no arguments left 
{ 
    //instead of this you should allocate and then copy; or use strdup 
    strcpy(buff_namelist[index], argv[optind]); 

    ++index; //move to next index in array 
} 

правильный код будет:

char *buff_namelist[25]; //the array that the arguments are stored in 

while (optind < argc && argc < 25) //loop until no arguments left 
{ 

    buff_namelist[index]= strdup(argv[optind]); 

    ++index; //move to next index in array 
    optind++; //or somehow update optind 
} 
+0

Большое вам спасибо. Не могу поверить, что я не понимал, что я тоже не увеличиваю optind. – pudumaster

0

код

char *buff_namelist[25]; // array that the arguments are stored in 
*buff_namelist = malloc(25 * 25); //allocating memory for the array 

совершенно неправильно. По крайней мере, это должно быть

char* buff_namelist[25]; 
for (int i=0; i<25; i++) { 
    char* p = malloc(100); 
    if (!p) { perror("malloc"); exit(EXIT_FAILURE); }; 
    buff_name[i] = p; 
} 

, но даже вышеупомянутое, вероятно, неверно. Возможно, вы хотите использовать strdup.

И самое главное, если argv является вторым аргументом main вы можете скопировать указатели в нем (не нужен скопировать содержимое строки), как buf_name[i] = argv[optind+i];

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