【发布时间】:2018-05-09 06:29:08
【问题描述】:
我基本上在做的是
- 将指向结构的指针传递给函数并
- 然后被调用的函数通过 malloc 为其分配内存。
现在,当我在 Caller 函数中访问此内存时,没有错误。
但是,如果我在分配后尝试在被调用函数中访问相同的内容。
- 访问数组的第一个索引没有错误
- 但是当我尝试访问该数组的下一个索引时,会出现分段错误
我正试图了解这里发生了什么,或者我错过了什么。
#include <stdio.h>
#include <stdlib.h>
typedef struct _Data
{
int a;
int b;
int c;
} Data_t;
void update(Data_t** ppData)
{
int i;
*ppData = malloc(3 * sizeof(Data_t));
if(*ppData == 0)
{
puts("Error malloc\n");
}
printf("2:Addr = %u %u\n", &ppData, ppData);
#if 1
for(i=0; i < 3; i++)
{
ppData[i]->a = (i+1)*10;
ppData[i]->b = (i+1)*20;
ppData[i]->c = (i+1)*30;
printf("3:[%d] %d %d %d\n", i, ppData[i]->a, ppData[i]->b, ppData[i]->c);
}
#endif
}
int main()
{
Data_t* data;
int i = 0;
printf("1:Addr = %u %u\n", &data, data);
update(&data);
printf("2:Addr = %u %u\n", &data, data);
#if 0
for(i=0; i < 3; i++)
{
data[i].a = (i+1)*10;
data[i].b = (i+1)*20;
data[i].c = (i+1)*30;
printf("4:[%d] %d %d %d\n", i, data[i].a, data[i].b, data[i].c);
}
#endif
for(i=0; i < 3; i++)
{
printf("5:[%d] %d %d %d\n", i, data[i].a, data[i].b, data[i].c);
}
}
【问题讨论】:
-
您没有正确引用指向指针的指针。尝试像这样使用它。 (*ppData)[i].a = (i+1)*10;
-
输出错误信息时,应该输出到
stderr,而不是stdout当错误条件来自系统函数时,还应该输出指示系统为什么认为错误的文本发生了。建议使用:perror( "malloc failed" );,这将满足这两个要求。 -
当出现无法恢复的错误时,例如调用
malloc()失败,然后通过perror()显示错误信息后,如有必要应“清理”,退出程序.发布的代码继续执行程序,就好像对malloc()的调用成功。 -
一般来说,以“_”开头后跟大写字母的名称和/或以“_t”结尾的名称是为系统“保留”的,因此“不应”由用户生成程序。
-
发布的代码包含几个“神奇”数字。 “魔术”数字是没有基础的数字。 IE。 3、10、20、30。“神奇”数字使代码更难理解、调试等。建议使用
enum语句或#define语句为这些“神奇”数字赋予有意义的名称,然后使用那些整个代码中有意义的名称。
标签: c arrays memory heap-memory