Я пытался реализовать простую функцию, которая может конкатенировать любое количество переданных ей строк. Мой вызов realloc завершился неудачно. Это связано с тем фактом, что строковые аргументы, которые я передаю функции, хранятся в сегменте данных, где, когда realloc пытается выделить память из кучи? Это просто идея, которую я имею. Я новичок, поэтому, пожалуйста, извините, если это кажется глупым. Как я могу запустить эту функцию?realloc() Failure
//Program to implement a function that can concatenate any number of argumnets
#include<stdio.h>
#include<stdarg.h>
#include<string.h>
#include<stdlib.h>
char *mstrcat(char *first, ...);
int main(int argc, int **argv){
char *s;
s=mstrcat("I ","Love ","Stack","Overflow");
printf("%s\n",s);
}
char *mstrcat(char *first, ...){
char *s=first,*p;
int len=0; // stores the length of the string as it grows
len=strlen(s);
va_list aptr; // creates a pointer to the unnamed argument list
va_start(aptr,first); // initialise aptr to the first unnamed argument
if(aptr==NULL){
return s;
}
while((p=va_arg(aptr,char *))!=NULL){ // till there are no more arguments to process
len+=strlen(p);
if((s=(char *)realloc(s,len+1))!=NULL){
strcat(s,p);
}
else{
printf("Failed to concatenate\n");
return first;
}
}
return s;
}
Вы не передаете NULL в качестве последнего аргумента для mstrcat здесь. Это заставит ваш цикл читать данные мусора. Это действительно тестовый пример, который вы используете? Если нет, можем ли мы увидеть реальный тестовый пример? – templatetypedef
Были ли строки, которые вы передаете mstrcat(), выделенные malloc() или компанией? В противном случае вы не можете сделать realloc() на них. Как указано [здесь] (http://linux.die.net/man/3/realloc): * Если значение ptr равно NULL, оно должно быть возвращено предыдущим вызовом malloc(), calloc() или realloc() . * – m0skit0
@templatetypedef я добавил 'NULL' и следующие строки кода, и он работал нормально. 'len = strlen (first);' s = (char *) malloc (len + 1); '' strcpy (s, first); '. Спасибо за вашу помощь. – Bazooka