37f091b
嗨,我写了一个程序,在malloc概念的帮助下连接两个字符串。我弄错了。但是我没有得到的是当我改变下面的行时
#include<stdio.h>
#include<stdlib.h>
char* concatenate(char a[],char b[])
{
int length1,length2,i,j,k,l;
for(int i=0;a[i]!='\0';i++)
{
length1=i;
}
for(int j=0;b[j]!='\0';j++)
{
length2=j;
}
char *allocate=(char*)malloc((length1+length2+2)*sizeof(char));
for(k=0;k<=length1;k++)
{
allocate[k]=a[k];
}
allocate[k]=' ';
for(l=length1+2;l<=(length1+length2+2);l++)
{
allocate[l]=b[l-(length1+2)];
}
allocate[l]='\0';
return allocate;
}
int main()
{
char name1[]="Stack";
char name2[]="Overflow";
char* new=concatenate(name1,name2);
printf("%s\n",new);
free(new);
new=0;
return 0;
}
到
char *allocate=(char*)malloc((length1+length2+2)*sizeof(char));
输出保持不变,这怎么可能,因为我们需要至少长度1 +长度2 + 2个字节来存储差距?
答案 0 :(得分:2)
有两种可能性:
您的运行时环境分配的内存多于必要的内存,因此您的“Stack Overflow \ 0”字符串适合,但“Stack Overflooooooooooooow \ 0”不适合,或
您正在破坏内存超过您分配的块,并且C运行时环境不会引起注意,因为您的程序很简单。但是,如果你的程序稍微复杂一些(例如,如果你试图分配更多的内存),你就会收到错误。
答案 1 :(得分:2)
char *allocate=(char*)malloc(sizeof(char));
与
相同char *allocate=malloc(1);
你准确地分配一个字节的内存,这只能保存空字符串,因为它只包含终止0
字节。