导致 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
它。但请注意:您将需要更改函数原型,否则您将无法访问它,尤其是free
it:
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