2013-04-23 3 views
0

Когда я запускаю следующую ошибку сегментации ... Целью является копирование массива argv для разрешения массива allowdip.Ошибка сегментации (сбрасывание ядра) при попытке копирования массива C

char *allowdip; 
int *allowdipcount; 


int main(int argc, char *argv) 
{ 
    int xer; 

    allowdipcount = argc; 

    for(xer=0; xer<allowdipcount; xer++) { 
    allowdip[xer]=argv[xer]; 
    } 

    for(xir=0; xir<allowdipcount -1; xir++) { 
    printf("%s\n", allowdip[xir]); 
    } 


exit(EXIT_SUCCESS); 
} 

Любые идеи о том, что я делаю неправильно?

UPDATE

Спасибо, теперь мой код:

char **allowdip; 
int allowdipcount; 

int main(int argc, char *argv) 
{ 
    int xer; 
    int xir; 

    allowdipcount = argc; 
    char **allowdip = malloc(allowdipcount * sizeof(char*)); 
    for(xer=0; xer<argc; xer++) { 
     allowdip[xer]=argv[xer]; 
    } 

    for(xir=1; xir<allowdipcount; xir++) 
    printf("%s\n", allowdip[xir]); 
    exit(EXIT_SUCCESS); 

} 

возвращается:

testscript2.c:51: warning: assignment makes pointer from integer without a cast 

линия 51 содержит:

allowdip[xer]=argv[xer]; 
+0

'int * allowdipcount;' -> 'int allowdipcount;' и 'aloowip' не инициализировать – BLUEPIXY

+1

Для начала получите достойный компилятор. Затем обратите внимание на диагностику, которую он создает для кода, который вы опубликовали. –

+0

'char * argv' - Это дерьмо. –

ответ

4

allowdip - неинициализированный указатель. Вам нужно выделить память для него

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

int main(int argc, char *argv[]) 
{ 
    int xer; 
    int allowdipcount = argc; 
    char **allowdip = malloc(allowdipcount * sizeof(char*)); 

    for(xer=0; xer<allowdipcount; xer++) { 
     allowdip[xer]=argv[xer]; 
    } 

    for(xer=0; xer<allowdipcount; xer++) { 
    printf("%s\n", allowdip[xer]); 
    } 
    free(allowdip); 
    return EXIT_SUCCESS; 
} 

Обратите внимание, что я сделал несколько других изменений в коде

  • allowdipcount должен быть типа int (в противном случае вам нужно выделить память для него тоже)
  • allowdip изменил тип быть массивом указателей char
  • подпись main был не совсем прав - argv должны б е а char* массив
  • Изменено ваши глобальные переменные локальными для main, поскольку не было очевидно, что потребность в них, чтобы быть глобальным
  • Измененный цикл printf перебрать все аргументы программы. Он пропустил последний аргумент в вашем вопросе.
  • освободил память, выделенную для нас allowdip когда мы закончили с ним
  • упрощенного возврат из main как предложил Винсент
+1

JFYI, 'allowdipcount' имеет тип' int * '. –

+0

@AlokSave Ты просто избил меня. Ipdated ответ включает код, показывающий, что 'allowdipcount' должен быть просто' int' – simonc

+1

, может ли мы иметь второй аргумент 'char *' в main? Я считаю, что это тоже неправильно. –

1

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

Счетчик должен быть целым числом, а не указатель:

int allowdipcount; 

и массив должен быть массивом указателей, а не символов:

char **allowdip; 

Тогда можно выделить:

allowdip = malloc(argc * sizeof *allowdip); 

и скопировать массив:

memcpy(allowdip, argv, argc * sizeof *allowdip); 

Обратите внимание, что это не копирует фактические строки аргументов, а только массив указателей на строки. Он также не включает указатель NULL на argv[argc], который завершает работу массива.

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