我写了这段代码
#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
值,但会显示超过原始字符数。这不应该导致缓冲区溢出吗?不会破坏其他变量吗?
答案 0 :(得分:6)
当你写行
时pointer="Helllooooo the worlldddddd";
你不是说“取pointer
指向的数组并用字符串"Helllooooo the worlldddddd"
覆盖其内容”,而是“改变哪个字符串 {{1} }指向它,使它现在指向字符串pointer
。“这说明了当您直接打印""Helllooooo the worlldddddd"
时看到打印出来的原始字符串的原因 - 您从未真正修改过它。因此,您无需担心此处的数组溢出,因为您实际上并没有在其中编写任何内容。
另一方面,如果你写了
String
实际上 将新字符串的内容复制到strcpy(pointer, "Helllooooo the worlldddddd");
指向的缓冲区中,然后将缓冲区溢出,这将是一个问题。但请注意,这是一个非常不同的操作,明确表示“请将此字符串的内容复制到此位置”,而不是“更改此指针指向的位置。”
答案 1 :(得分:1)
你已经初始化了一个指向String&#34; Hello the world&#34; char *pointer=String;
到目前为止一切顺利
首先是printf printf(" %s\n",pointer);
,你打印的指针指向&#34; Hello the world&#34;。
然后你设置指针指向一个新的字符串&#34; Hellloooooo the worllddddd&#34; pointer="Helllooooo the worlldddddd";
。
然后你打印了指针,在这种情况下指向&#34; Hellloooooo the worllddddd&#34; printf("Hello %s\n",pointer);
。
最后printf你打印了字符串&#34;你好世界&#34; printf("Hello %s\n",String);
。
注意:。
((你在第二个printf("Hello %s\n",String);
和第三个printf printf("Hello %s\n",String);
打印的字符串你好,它将在指针或字符串的值之前打印))
答案 2 :(得分:1)
操作字符串时要考虑的另一个快速选项:
字符串函数 strdup(...); 允许通过一个简单的步骤将现有字符串复制到新创建的字符串中。 (或至少一个已经抽象出所有复杂性的东西):
char *pointer = strdup("Helllooooo the worlldddddd");
新字符串pointer
现在可用于包含长度不超过len
的任何字符串,其中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(...):
创建的字符串需要是免费的,以避免内存泄漏。使用完pointer
时调用以下内容:
free(pointer);
答案 3 :(得分:1)
#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;
}
我认为你想做什么。