Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 反向存储价值?_C_Pointers - Fatal编程技术网

C 反向存储价值?

C 反向存储价值?,c,pointers,C,Pointers,我编写了使用指针连接两个字符串的函数。与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

我编写了使用指针连接两个字符串的函数。与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'。。这是存储它们的方式吗?

它不是以负方向存储的,而是因为您在while循环
中递增指针(
*s++
),而在串联时(*s++=*d++)!='\0');
),因此在
s
末尾指向字符串的末尾。 您可能需要保存指针的副本,以确保在
string\u cat

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

char b[] = "Hello";

是一个固定大小的缓冲区。将
b1
b
连接将最终导致缓冲区溢出,导致UB并可能最终崩溃。

它不是以负方向存储的,而是因为在连接时,您正在增加指针(
*s++
在while循环
while(*s++=*d++)!='\0');
),因此,在末尾
s
指向字符串的末尾。 您可能需要保存指针的副本,以确保在
string\u cat

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

char b[] = "Hello";

是一个固定大小的缓冲区。将
b1
b
连接将最终导致缓冲区溢出,导致UB并可能最终崩溃。

首先
b
太小,无法容纳连接的字符串。它只有足够的空间容纳
Hello\0
,因此您所做的是未定义的。第二,看看这一行:

while((*s++ = *d++)!='\0');
        ^^^
您正在推进
s
,因为您正在增加它。每次增加它时,您应该想象它向前指向一个元素。当你走到尽头时,
s
不是它最初的样子。因此
s[-2]
实际上比原来的
s
更靠后(在你的例子中是
b


编辑
那么,如何声明它,以便它动态地调整到新的大小呢

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

  • 这样声明:
    charb[LENGTH]=“Hello”
  • 将另一个参数传递到指定大小的
    string\u cat

经过多次迭代后,最终会得到类似于
strncpy
/
memcpy

的结果。首先
b
太小,无法容纳连接的字符串。它只有足够的空间容纳
Hello\0
,因此您所做的是未定义的。第二,看看这一行:

while((*s++ = *d++)!='\0');
        ^^^
您正在推进
s
,因为您正在增加它。每次增加它时,您应该想象它向前指向一个元素。当你走到尽头时,
s
不是它最初的样子。因此
s[-2]
实际上比原来的
s
更靠后(在你的例子中是
b


编辑
那么,如何声明它,以便它动态地调整到新的大小呢

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

  • 这样声明:
    charb[LENGTH]=“Hello”
  • 将另一个参数传递到指定大小的
    string\u cat

在多次迭代之后,您最终会得到类似于
strncpy
/
memcpy

的结果。那么,如何声明它,以便它动态地调整到新的大小?那么,如何声明它,以便它动态地调整到新的大小?