使用char指针退出函数后出现分段错误

时间:2018-07-19 18:52:30

标签: c segmentation-fault

我正在使用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上,代码抛出分段错误。

1 个答案:

答案 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后释放所有使用的堆内存。