2015-12-09 2 views
1

Я передаю строку в структуры, я делаю это так внутри циклнеправильно копирование в структуры

printf("copy = %s\n",copy_p); 
str[i].string=(char*)malloc(strlen(copy_p)+1 * sizeof(char)); 
strcpy(str[i].string,copy_p); 
printf("skop = %s\n" , str[i].string); 

Так что если copy_p переменная «Программа перестала работать» это то, что происходит

printf("copy = %s\n",copy_p); // copy = Program has stopped working 
printf("skop = %s\n" , str[i].string); // skop = Program has stopped working 

Но если я назову это printf("%s\n",str[0].string), он выдает Program has stopped work!, почему это так? но оно не нравится все это время он работает для большинства входов

+2

Что type is 'copy_p' и какой он размер? –

+1

Если 'copy_p' является указателем, верните длину строки с помощью' strlen'. – Downvoter

+0

Я предлагаю вам использовать временную: «int tempSize = (sizeof (copy_p) +1;», а затем разбить строку после и проверить tempSize. –

ответ

6

Эта строка неверна независимо от типа copy_p:

str[i].string=(char*)malloc(sizeof(copy_p)+1 * sizeof(char)); 
  • Если copy_p является массив символов инициализируется строковым, т.е.

    char copy_p[] = "Program has stopped working"; 
    

    затем +1 ненужно, так как размер массива уже включает в себя нулевой терминатор.

  • Если copy_p указатель char *copy_p, то вам нужно позвонить strlen вместо sizeof, т.е.

    str[i].string=malloc(strlen(copy_p)+1 * sizeof(char)); 
    

Примечание: результаты литья из malloc ненужно в С.

+0

Да - я пытался сбросить подсказки :) –

+0

попробовал с strlen, и он сделал то же самое, это не происходит для всех строк tho, большинство из них прекрасны после печати ... – user3706129

+0

@ user3706129 It выглядит как что-то еще в вашем код вставляет нулевой ограничитель в вашу строку до четырех символов до конца. Исходный код (с 'sizeof' вместо' strlen') мог произойти, потому что соседний блок был выделен для какой-либо другой строки или структуры. С помощью 'strlen' это может произойти из-за ошибки памяти в другом месте. Попробуйте запустить программу через valgrind или какой-либо другой профиль памяти, чтобы узнать, что происходит. – dasblinkenlight

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