通过malloc-heap分配内存(Concatenate字符串)

时间:2017-06-24 15:49:08

标签: c pointers

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个字节来存储差距?

2 个答案:

答案 0 :(得分:2)

有两种可能性:

  • 您的运行时环境分配的内存多于必要的内存,因此您的“Stack Overflow \ 0”字符串适合,但“Stack Overflooooooooooooow \ 0”不适合,或

  • 您正在破坏内存超过您分配的块,并且C运行时环境不会引起注意,因为您的程序很简单。但是,如果你的程序稍微复杂一些(例如,如果你试图分配更多的内存),你就会收到错误。

答案 1 :(得分:2)

char *allocate=(char*)malloc(sizeof(char));

相同
char *allocate=malloc(1);

你准确地分配一个字节的内存,这只能保存空字符串,因为它只包含终止0字节。

如果你超出对象的界限,C不会阻止你。这只是未定义的行为。结果可能是任何事情,包括似乎工作的程序。但是第二天,或者通过其他一些输入,它可能会崩溃,允许系统中的入侵者,甚至将你的猫咪涂成绿色。只需避免未定义的行为