为什么这个C代码没有改变字符串并导致缓冲区溢出?

时间:2017-02-22 17:44:26

标签: c string pointers

我写了这段代码

#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值,但会显示超过原始字符数。这不应该导致缓冲区溢出吗?不会破坏其他变量吗?

4 个答案:

答案 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;
} 

我认为你想做什么。