0

我编写了使用指针连接两个字符串的函数。和 strcat(s,t) 一样,所以在 s 的末尾会加上 t..

   int main ()
{
  char b[] = "Hello";
  char b1[] = "world";
  string_cat(b,b1);
  printf("Concatenated string is %s\n",b);
  return 0;
}
int string_cat(char *s, char *d)
{
  while(*++s != '\0')
    ;
  *s++ = ' ';
  while((*s++ = *d++)!='\0');  // Concatenation
  printf("S is %c\n",s[-2]);   // Just to see the values
}

串联工作正常,但是当我想查看元素的存储方式时,所有元素都以负方向存储,我的意思是 s[-2] 等于 'd', s[-3] 等于 'l' 。 .它们是这样存储的吗?

4

2 回答 2

3

首先b是太小而无法容纳连接的字符串。它只有足够的空间来容纳Hello\0,所以你正在做的事情是不确定的。其次,看这一行:

while((*s++ = *d++)!='\0');
        ^^^

你在进步s,因为你在增加它。每次增加它时,您应该想象它指向一个元素。当你走到尽头时,s不是它开始的样子。所以s[-2]实际上比原来的sb在你的情况下)更远。


编辑

那么,如何声明它,使其动态调整为新的大小?

如果可能的话,让它调整到合适的尺寸是很困难的。你可以做什么:

  • 像这样声明它:char b[LENGTH] = "Hello";
  • 传递另一个参数来string_cat指定大小

经过多次迭代,你最终会得到类似strncpy/的东西memcpy

于 2013-01-07T07:25:42.470 回答
2

它不是以负方向存储,而是因为您在连接时递增指针(*s++在 while 循环中while((*s++ = *d++)!='\0');),所以在结尾处s指向字符串的结尾。您可能需要保存指针的副本以确保不会丢失字符串的开头(如果需要)string_cat

您的代码还有其他可能导致堆栈缓冲区溢出的潜在问题。

char b[] = "Hello";

是一个固定大小的缓冲区。连接最终会导致缓冲区溢出,从而导致 UB 并最终可能崩溃b1b

于 2013-01-07T07:25:10.603 回答