C 指针如何分配内存

C 指针如何分配内存,c,pointers,segmentation-fault,gets,C,Pointers,Segmentation Fault,Gets,输出=分段故障 为什么会出现分段错误?如果出现 #include<stdio.h> int main() { char *str; gets(str); puts(str); return 0; } str在未初始化的情况下使用。作为一个自动本地变量,除非显式初始化,否则str的内容是不确定的。它可能指向未分配给程序的内存位置 使用尝试写入或甚至读取未初始化内存会导致。分割错误是一种副作用 也就是说,GET是纯粹的邪恶,因为可能存在缓冲区溢出问题。改为使用。指针

输出=分段故障

为什么会出现分段错误?

如果出现

#include<stdio.h>
int main()
{

  char *str;

  gets(str);

  puts(str);

return 0;
}
str在未初始化的情况下使用。作为一个自动本地变量,除非显式初始化,否则str的内容是不确定的。它可能指向未分配给程序的内存位置

使用尝试写入或甚至读取未初始化内存会导致。分割错误是一种副作用


也就是说,GET是纯粹的邪恶,因为可能存在缓冲区溢出问题。改为使用。

指针如何分配内存这个问题的答案很简单:它们不分配内存。这就是为什么会出现分段错误:从未初始化的指针访问数据是未定义的行为

程序员必须分配内存,并将其分配给指针。例如,您可以使用malloc:


关于上述修复,需要注意的一点是使用fgets而不是不推荐使用的get。这是因为fgets让您告诉函数它可以在缓冲区中使用多少内存,而get则假定它拥有所需的所有内存,从而导致缓冲区溢出。

您需要首先分配str。 像这样:

char *str = malloc(10);
fgets(str, 10, stdin);
puts(str);
这将允许在str中写入

为了更好地分配内存,最好知道需要多少内存,而不是任意分配4096


此外,当你不再需要它时,不要忘记使用free。

当你声明一个指针时,你所做的只是留出空间来存储另一个对象的地址;你没有为另一个物体留出任何空间

这里有一个假设的内存映射地址是凭空提取的,不代表任何真实的字结构,假设32位字:

#include <stdio.h>

int main()
{

  char *str;

  str = malloc(4096);
  gets(str);

  puts(str);

  free(str);
  return (0);
}
变量str驻留在地址0xfff86400处。由于您使用自动存储持续时间(即在函数内)声明str,并且没有显式初始化它,因此其值是不确定的;它包含一个未知的位模式,很可能与程序中的可写地址不对应。获取尝试将数据写入此无效地址,因此 第1段。输入例程fgets、scanf、fscanf、fread等都不会留出内存来存储实际输入;这是你的责任

当您想通过指针操作某个对象时,需要分配指针指向的对象。例如,您可以这样做:

Item        Address        0x00  0x01  0x02  0x03
----        -------        ----  ----  ----  ----
str         0xfff86400       ??    ??    ??    ??  // ?? represents unknown byte value
char buf[8] = "blah!";
char *str = buf;
这会留出一个缓冲区来存储最多8个字符,然后将该缓冲区的第一个元素的地址分配给str,这样我们就可以看到:

Item        Address        0x00  0x01  0x02  0x03
----        -------        ----  ----  ----  ----
str         0xfff86400       ??    ??    ??    ??  // ?? represents unknown byte value
char buf[8] = "blah!";
char *str = buf;
类似地,您可以使用malloc动态分配str指向的内存:

Item        Address        0x00  0x01  0x02  0x03
----        -------        ----  ----  ----  ----
buffer      0xfff86400      'b'   'l'   'a'   'h'
            0xfff86404      '!'    00    ??    ??
str         0xfff86408       ff    f8    64    00 
malloc留出BUF_大小的字节来存储输入字符串,并将指向该空间的指针分配给str


1.严格来说,取消引用无效指针的行为是未定义的;断层是许多可能的结果之一。它也可以很容易地删除一些重要的内容,使您的程序继续运行,但现在具有管理员权限。

指针不分配内存。如果您要分配内存,则需要调用mallocstr,它只是一个指针。str指向内存的哪个区域?不知道?我也不知道,因为你没有草签。它可能指向任何地方。实际上,你很幸运它崩溃了。建议:阅读更多关于pointers@ShubhamTiwari不客气。如果这回答了你的问题,请考虑通过点击旁边的灰色复选标记来接受答案。这将让其他站点访问者知道您的问题已经解决,并在堆栈溢出时为您赢得一枚徽章。