导致 EXC_BAD_ACCESS 的指针分配

Posted

技术标签:

【中文标题】导致 EXC_BAD_ACCESS 的指针分配【英文标题】:Pointer assignment causing EXC_BAD_ACCESS 【发布时间】:2021-10-28 08:21:31 【问题描述】:

我有以下给出错误的代码: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));,但您还需要跟踪该指针,以便稍后释放它。现在,一旦函数结束导致内存泄漏,它就会丢失。 感谢您的意见。我错过了理解指针的这一方面,误认为它是空指针。 【参考方案1】:

ind *sub;

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

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

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


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

    你可以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);
    
    

    指向一个已经存在的结构,例如指向一个全局变量:

    //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。

以上是关于导致 EXC_BAD_ACCESS 的指针分配的主要内容,如果未能解决你的问题,请参考以下文章

聊天应用,分配问题。 Xcode 中的自定义类初始化错误(EXC_BAD_ACCESS 代码=2)

exc_bad_access(code=1, address=0x789870)野指针错误

尝试在函数内动态分配父指针给子指针会导致分段错误

ALAsset 指针在访问时抛出 EXC_BAD_ACCESS

EXC_BAD_ACCESS 在用于基数排序的链表中的指针上

UnsafeMutableRawPointer 到 UnsafeMutablePointer<T>:指针上的 EXC_BAD_ACCESS