c - 关于修改 char * 元素的 SIGSEGV

标签 c pointers malloc char-pointer

<分区>

在下面的程序中,

#include<stdio.h>
#include<stdlib.h>
int main(){
  const char *str1 = "abc";
  char *str2 = (char *)malloc(sizeof(char)*4);
  str2= "def";
  str2[1]='s';
  printf("str2 is %s", str2);

}

调试器:

(gdb) ptype str1                                                                                                                         
type = const char *                                                                                                                      
(gdb) ptype str2                                                                                                                         
type = char *                                                                                                                            
(gdb) n                                                                                                                                  
7         str2[1]='s';                                                                                                                   
(gdb) n               

Program received signal SIGSEGV, Segmentation fault.                                                                                     
0x00000000004005ab in main () at main.c:7                                                                                                
7         str2[1]='s';                                                                                                                   
(gdb)

str2[1] = 's'; 上的 SIGSEGV

根据我的理解,由于声明 const char *st1 = "abc",不能修改 st1 指向的 abc,其中字符串文字是常量。

为什么 char * 类型 str2 不允许修改元素? stringliteral def 也是常量字符串文字吗。

最佳答案

事情是这样的:

  1. str2分配有 malloc()并指向新分配的 4 个字符的缓冲区

  2. 您更改 str2 的值(地址)地址"def" ,它是只读的(将其视为程序的一部分)

  3. 你尝试改变"def"

  4. 您无法释放内存,因为您在分配 str2 时实际上丢失了它的地址地址"def"

关于c - 关于修改 char * 元素的 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40145998/

相关文章:

c++ - Valgrind 在不应该的时候报告竞争条件

c - 使用 gdb 调试回调

c++ - 线程: I want to pass a struct pointer in main to a function called by pthread

c - 为什么这个变量等于一个数字和一个字符?

c - 使用 realloc 填充内存

比较指针和整数。如何解决?

c++ - 制作可移植代码

C++ 继承,发送指向基类的指针

c - 使用指向数组的指针

c - *** 检测到 glibc *** 无效指针 : 0x00000031bee21188