【问题标题】:Pointer assignment causing EXC_BAD_ACCESS导致 EXC_BAD_ACCESS 的指针分配
【发布时间】:2025-12-12 11:00:02
【问题描述】:

我有以下给出错误的代码:EXC_BAD_ACCESS(代码=2,地址=0x100000000)。错误是由于这行代码造成的:sub->str = s;。 我不太明白为什么会这样,因为我将char(即s)的地址传递给char(即sub->str)的指针。

#include <stdio.h>
#include <stdlib.h>

struct Index {
    char *str;
};

typedef struct Index ind;

int fxn_one(char *s)
{
    ind *sub;
    sub->str = s;   // Error due to this line of code.
    return (0);
}

int main(int argc, char* argv[])
{
    char *p = "test";
    int ret = fxn_one(p);
    return (0);
}

【问题讨论】:

  • sub 指向什么?它是未初始化的,所以它可能指向任何地方。你不能只写随机存储器。
  • ind *sub; 声明了一个未初始化的指针。你需要把它指向某个东西。一种方法是ind *sub = malloc(sizeof(*sub));,但您还需要跟踪该指针,以便稍后释放它。现在,一旦函数结束导致内存泄漏,它就会丢失。
  • 感谢您的意见。我错过了理解指针的这一方面,误认为它是空指针。

标签: c pointers struct typedef


【解决方案1】:

ind *sub;

您正在指示编译器使用 4/8 字节来包含指向结构 ind(地址)的指针,具体取决于您的系统架构。该指针存储在堆栈区中,因为它是函数fxn_one的局部变量。

这个地址是什么?这取决于分配给它的值。 但你永远不会给它分配任何东西,所以它会包含当时堆栈中存在的任何东西:通常是垃圾;肯定不是有效地址

在其中写入或访问指向它的结构的字段(这也将是无效的)将导致未定义的行为,因此提高EXC_BAD_ACCESS 是一种警告您...错误访问的温和方式。


您需要做的是分配结构以获得有效地址。

  1. 你可以malloc它。但请注意:您将需要更改函数原型,否则您将无法访问它,尤其是freeit:

    ind * fxn_one(char *s)
    {
        ind *sub = malloc(sizeof (ind));
    
        //Recommended: check if malloc returned NULL, in case it wasn't able to allocate the heap you requested
        sub->str = s;   //In this case the address will be valid
        return ind;
    }
    
    int main(int argc, char* argv[])
    {
        char *p = "test";
        ind * data = fxn_one(p);
    
        free (data);
    
        return (0);
    }
    
  2. 指向一个已经存在的结构,例如指向一个全局变量:

    //Global struct
    ind gl_ind = { NULL };
    
    int fxn_one(char *s)
    {
        ind *sub = &gl_ind;
    
        sub->str = s;   //Also in this case the address will be valid
        return (0);
    }
    

    在这种情况下你不需要更改fxn_one的接口。

【讨论】:

  • 感谢您的完整回答。我继续提出建议 2。