void adicionaHashtag(char* x){
char*y=malloc(sizeof(x));/***ERROR IS HERE***/
int i;
for(i=0; i<strlen(x); i++){
y[i]=tolower(x[i]);
}
Вы пытаетесь выделить и инициализировать строку с копией строки, на которую указывает x
.
sizeof(x)
- размер указателя char*
. Обычно это 4 или 8 байтов. Вы должны выделить достаточно места для хранения самой строки.
char *y = malloc(strlen(x) + 1);
+ 1
является возможность для завершающего нулевого символа '\0'
.
Вызов strlen
на каждой итерации цикла неэффективен, но не является неправильным; Сейчас я оставлю это. . Там есть потенциальная проблема, если какой-либо из скопированных символов имеют отрицательные значения (неудачную характеристику функции tolower()
Назначение должно быть:
y[i] = tolower((unsigned char)x[i]);
Наконец, скажем x
указывает на строку "hello"
Вы правильно копируя. 5 символов -., но не окончательный '\0'
Одним из возможных решений является изменение <
в состоянии петлевой <=
, который будет копировать символы от 0 до 5, а не от 0 до 4.
Но вы можете просто использовать существующий strcpy
функция, которая обрабатывает все это для вас (И более эффективно):
char *y = malloc(strlen(x) + 1);
strcpy(y, x);
(. Вы должны также проверить значение, возвращаемое malloc
, и относиться к нему как ошибка, если это NULL
)
по этому вопросу, вы, вероятно, не нужно y
вообще. x
уже является указателем на строку. Скопируйте его в память, выделенную для y
, а затем скопируйте ее в aux->nome
. Если нет кода, который вы нам не показали, который использует y
, это не нужно (и утечка памяти!). Вы можете оставить декларацию y
и код, который инициализирует его и просто скопировать из x
непосредственно:
Lista_Hashtags *aux = malloc(sizeof *aux);
strcpy(aux->nome, x);
(Это предполагает, что aux->nome
является массивом, а не указатель, и что это достаточно большой, чтобы держать копию строки.)
(Обратите внимание, что я изменил свой malloc
призыв к более простой и надежной форме.)
Использование 'SizeOf (х)' неверен там. Выделите память равной 'strlen (x) + 1'' 'y'. – ameyCU
Кроме того, не забудьте добавить '\ 0' в' y' или 'strcpy', будут проблемы. –
извините заранее за вопрос «нуб». Как я должен добавить \ 0 в y? strcpy действительно дает проблемы. @Johny Mopp –