我正在使用C中的用户界面编写代码,而char指针存在问题。我团队的另一个人用这样的算法进行算法:
typedef struct
int index;
char * buffer;
//...another fields
} ui_cfg;
int ui_Function (ui_cfg *cfg)
{
char localBuffer[100];
cfg->buffer = localBuffer;
printf("\n[1]cfg->buffer %p", cfg->buffer);
printf("\n[2]localBuffer %p", localBuffer);
Adapter(cfg->buffer);
printf("\n[3]localBuffer %p", localBuffer);
printf("\n[4]cfg->buffer %p", cfg->buffer);
//...irrelevant code
}
这是代码的非常非常简化的版本,但是它具有必不可少的部分。在实际代码中,在第二函数中使用函数指针调用Adapter。适配器功能执行以下操作:
int Adapter (char * buffer)
{
int idx;
idx = sprintf (buffer, "Test string");
return idx;
}
我的问题是下一个。当我运行代码时,它将在Segmentation Fault
指令中抛出printf("\n[4]cfg->buffer %p", cfg->buffer);
。但是,另一个printf可以正常工作,并显示相同的内存方向。我不明白为什么代码此时会崩溃。可能是什么问题?
详细信息: 此代码在两种不同的体系结构上使用arm-brcm-linux-gnueabi-gcc和mipsel-linux-uclibc-gcc进行编译。在ARM上,此代码可以正常工作,并且cfg-buffer包含“测试字符串”。在MIPSEL上,代码抛出分段错误。
答案 0 :(得分:2)
像这样更改ui功能:
// caller will need to free cfg->buffer when finished using
int ui_Function (ui_cfg *cfg)
{
char* heapBuffer = malloc(100);
cfg->buffer = localBuffer;
// etc
}
或者:
int ui_Function (ui_cfg *cfg, char* buffer)
{
cfg->buffer = buffer;
// etc
}
在当前版本中,localBuffer是一个堆栈变量,在函数返回时将被清除。在某些操作系统上,函数返回后仍可能可以访问它(可能在短时间内),但在另一些操作系统上,它将重新用于其他用途。这就是所谓的未定义行为,即BAAAAAD。
要分配一些在函数返回时仍将存在的内存,您可以从堆中分配一些内存,也可以将自己的缓冲区传递给函数。
别忘了释放完cfg后释放所有使用的堆内存。