使用错误定位字符串的 C 分段错误



本质上,我的代码中有一个链接列表的结构,

struct node{
  char* val;
  struct node *next;
};

,然后我尝试做一些事情...

...
addr = malloc(sizeof(struct node));
addr->val = malloc(72);
addr->val = "";
snprintf(addr->val, 1000, "%s", ident);
...

...这给了我SNPRINTF的细分故障。Valgrind说以下

Process terminating with default action of signal 11 (SIGSEGV)
==10724==  Bad permissions for mapped region at address 0x40566B
==10724==    at 0x4EB0A32: vsnprintf (vsnprintf.c:112)
==10724==    by 0x4E8F931: snprintf (snprintf.c:33)
==10724==    by 0x4016CC: id (Analyzer.c:267)
...

我对C而不是C 是新手工作。我还让我的程序打印出两个变量的地址,地址valgrind抱怨确实来自addr-> val。

我也尝试使用strcpy而不是snprintf,但结果相同。

谢谢。

addr->val = malloc(72);

此行动态分配72个字节,并将该内存区域的地址分配给addr->val

addr->val = "";

然后将addr->val设置为指向字符串常数的地址,丢弃了先前包含的内存的杂点区域的地址,从而导致内存泄漏。

然后,当您尝试使用snprintf时,您正在尝试写入字符串文字。由于这些通常存储在仅读取的内存部分中,因此尝试这样做会导致核心转储。

不需要addr->val = "";。它扔掉了分配的内存;它没有将分配的内存设置为一个空字符串,这可能是您认为它会做的。即使这样做,无论如何也没有用,因为snprintf会覆盖任何可能存在的东西。

代码

addr->val = malloc(72);
addr->val = "";             <====

用",静态区域的地址(值0)制成的静态区域的地址覆盖val指针。删除这条线。

snprintf(addr->val, 1000, "%s", ident);

仅分配72个字符时接受1000的长度。

snprintf(addr->val, 72, "%s", ident);

更好。

addr->val = malloc(72);
addr->val = "";

第二行将addr->val重新分配到仅读取部分(字符串文字为位置)中的地址,并丢弃malloc分配的地址,这可能导致潜在的内存泄漏。

我知道您想清除它。要分配字符串,您应该使用strcpy()

strcpy(addr->val, "");

,但是由于您想清空它,最容易将第一个字符设置为零:

addr->val[0] = '';

此外,您正在尝试做潜在的有害工作:

snprintf(addr->val, 1000, "%s", ident);

您打算分配72个字节,但是为什么我们的第二个参数最高为1K?将其更改为更安全的数字:

snprintf(addr->val, 72, "%s", ident);

那时一切都应该很好。

相关内容

  • 没有找到相关文章

最新更新