繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM