我試圖實現一個簡單的函數,可以連接任何數量的字符串傳遞給它。我對realloc的調用失敗。是否這樣做是因爲我傳遞給函數的字符串參數存儲在數據段中,realloc看起來是從堆中分配內存的?這只是我的一個想法。我是初學者,所以請原諒,如果它似乎愚蠢。我如何使這個功能運行?realloc()失敗
//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 2012-02-01 08:49:49
您是通過malloc()或公司分配給mstrcat()的字符串嗎?否則你不能對它們做一個realloc()。正如[here](http://linux.die.net/man/3/realloc)所述:*除非ptr爲NULL,否則它必須早先通過調用malloc(),calloc()或realloc() 。* – m0skit0 2012-02-01 08:53:28
@templatetypedef我添加了'NULL'和下面的代碼行,它工作正常。 'len = strlen(first);''s =(char *)malloc(len + 1);''strcpy(s,first);'。謝謝你的幫助。 – Bazooka 2012-02-01 09:41:23