C 反向存储价值?
我编写了使用指针连接两个字符串的函数。与strcat(s,t)一样,在s的末尾将添加tC 反向存储价值?,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
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
的结果。那么,如何声明它,以便它动态地调整到新的大小?那么,如何声明它,以便它动态地调整到新的大小?