[英]Why doesn't this C code change the string and cause a buffer overflow?
我写了这段代码
#include <stdio.h>
int main()
{
char String[] = "Hello the world!";
char *pointer = String;
int i;
printf(" %s\n", pointer);
pointer = "Helllooooo the worlldddddd";
printf("Hello %s\n", pointer);
printf("Hello %s\n", String);
return 0;
}
但我无法理解这条线是如何工作的。
pointer = "Helllooooo the worlldddddd";
但我得到了这个输出
Hello the world!
Hello Helllooooo the worlldddddd
Hello Hello the world!
如您所见,它无法更改String
值,但显示的字符数超过原始字符数。 这不应该导致缓冲区溢出吗? 不会破坏其他变量吗?
当你写行
pointer="Helllooooo the worlldddddd";
你不是说“通过pointer
数组,用字符串"Helllooooo the worlldddddd"
覆盖其内容,”而是“更改哪个字符串 pointer
指向,以便它现在指向字符串""Helllooooo the worlldddddd"
。 “这说明了当你直接打印String
时你看到原始字符串被打印出来的原因 - 你从来没有真正修改它。因此,你不必担心这里的数组溢出,因为你实际上并没有写任何事情。
另一方面,如果你写了
strcpy(pointer, "Helllooooo the worlldddddd");
实际上它 会将新字符串的内容复制到pointer
的缓冲区中,然后你会有一个缓冲区溢出,这将是一个问题。 但请注意,这是一个非常不同的操作,明确表示“请将此字符串的内容复制到此位置”,而不是“更改此指针指向的位置”。
你已初始化一个指向字符串“Hello the world”的char *pointer=String;
到现在为止还挺好 。
首先是printf printf(" %s\\n",pointer);
,你已经打印了指向“Hello the world”的指针。
然后你设置指针指向一个新的字符串“Hellloooooo the worllddddd” pointer="Helllooooo the worlldddddd";
。
然后你打印了指针,在这种情况下指向“Hellloooooo the worllddddd” printf("Hello %s\\n",pointer);
。
last printf你打印了字符串“Hello the world” printf("Hello %s\\n",String);
。
注意:。 ((你已经在第二个printf("Hello %s\\n",String);
打印出来了printf("Hello %s\\n",String);
以及第三个printf printf("Hello %s\\n",String);
字符串hello将在值之前打印指针或字符串))
操作字符串时需要考虑的另一个快速选项:
字符串函数strdup(...); 允许通过一个简单的步骤将现有字符串复制到新创建的字符串中。 (或至少有一个所有复杂性已被抽象出来) :
char *pointer = strdup("Helllooooo the worlldddddd");
新的字符串pointer
现在可用于包含最长为len
long的任何字符串,其中len
定义为:
int len = strlen(pointer);//len is 26 after using strdup(...); above
例如,因为您的示例字符串比len
短:
char String[]="Hello the world!";//length is 16
你可以将它复制到pointer
而没有缓冲区溢出:
strcpy(pointer, String);
使用strdup(...):
创建的字符串strdup(...):
需要被释放以避免内存泄漏。 使用完pointer
后调用以下命令:
free(pointer);
#include <stdio.h>
int main()
{
char String[]="Hello the world"; // the string
char *pointer=String; // pointer to string
char i; //counter
printf(" %s\n",pointer); // print current value of pointer
pointer="number of char"; // new value to replace the string
for (i=0;i<14;i++) // you cannot change the content of array without using loop
{
String[i] = pointer[i]; // char i in string = ti char i in pointer
}
printf("Hello %s\n",pointer); // print value of pointer
printf("Hello %s\n",String); // print value of string
return 0;
}
我想你想做什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.