gpt4 book ai didi

c - 结构成员在通过后损坏但再次通过后未损坏

转载 作者:太空宇宙 更新时间:2023-11-04 04:56:30 24 4
gpt4 key购买 nike

我的 ANSI C 程序中有一些非常奇怪的错误。我正在使用调试器,我观察到“size”变量在函数“doSthing”中已损坏。在“doSthing”之外,“size”得到了一个正确的值,但在“doSthing”内部,我得到了一个与它应该的值完全不同的值,可能是一些随机数据。这不是一个谜,但是......

在从“doSthing”调用的“doAnotherThing”中,我再次获得了正确的值。我想如果它传递了正确的值,它无论如何都没有损坏,我错了吗?但为什么它有不同的值(value)呢?

struct 中的指针在函数内部不会改变。为 oTVoTV->oT 分配了内存。

我真的不明白这里发生了什么......

typedef struct{
ownType *oT[] /* array of pointers */
int size;
} ownTypeVector;

void doSthing(ownTypeVector* oTV);
void doAnotherThing(ownTypeVector* oTV);


void doSthing(ownTypeVector* oTV)
{

...
doAnotherThing(oTV);
...

}

感谢您的评论,我收集了所有包含控制逻辑和数据结构的代码以便编译。它在嵌入式系统中运行,可以从多个来源接收字符,根据给定规则从中构建字符串,并在字符串准备好后调用需要该字符串的函数。这也可以是函数列表。这就是为什么我有函数指针——我可以简单地通过选择“activityFromCharacters”函数之外的函数来对很多事情使用相同的逻辑。在这里,我通过向 AVector 添加 A-s、B-s 和 C-s 来构建数据结构。 当然,这些独立来源中的每一个都有自己的静态字符串,因此它们不会互相干扰。

问题再次出现在更详细版本的代码中:

除了“handleCaGivenWay”之外,“aV->size”在任何地方都有一个合适的值。在调用之前,'aV->size' 是可以的,在'addA' 中 'aV->size' 也是可以的。离开 'handleCaGivenWay' 后就可以了。

#define                     NUMBER_OF_AS            1
#define NUMBER_OF_BS 5
#define NUMBER_OF_CS 10

typedef struct{
char name[81];
} C;

typedef struct{
C *c[NUMBER_OF_CS]; /* array of pointers */
int size;
int index;
} B;

typedef struct{
B *b[NUMBER_OF_BS]; /* array of pointers */
char name[81];
int size;
} A;

typedef struct{
A *a[NUMBER_OF_AS]; /* array of pointers */
int size;
} AVector;

typedef struct {
char *string1;
char *string2;
} stringBundle;

typedef struct{
void (*getCharacter)(char *buffer);
void (*doSthingwithC)(stringBundle* strings,AVector* aV);
AVector* aV;

} functionBundle;

void getCharFromaGivenPort(char *buffer)
{
//...
}

void addA(AVector * aV, stringBundle* strings)
{
aV->a[aV->size]->size = 0;
++aV->size;

int i = 0;

if(strlen(strings->string2) < 81)
{
for(i;i<81;++i)
{
aV->a[aV->size-1]->name[i] = strings->string2[i];
}
}
else {report("Too long name for A:");
report(strings->string2);}
}


void handleCaGivenWay(stringBundle* strings,AVector* aV)
{
A* a;
a = NULL;
if(aV->size) { a = aV->a[aV->size-1]; }

switch(1)
{
case 1: addA(aV,strings); break;
case 2: //addB()...

default: if (a && aV->size)
{ //addC(a->thr[a->size-1],c);
}

else report("A or B or C invalid");
break;
}
//handleCaGivenWay
}

void activityFromCharacters(stringBundle* strings,functionBundle* funcbundle)
{
/* some logic making strings from characters by */
/* looking at certain tokens */

(* funcbundle->doSthingwithC)(strings,funcbundle->aV);
}
//activityFromCharacters

AVector* initializeAVector(void)
{
AVector* aV;

if (NULL == (aV = calloc(1,sizeof(AVector))))
{ report("Cannot allocate memory for aVector."); }

int i = 0;
int j = 0;
int k = 0;

for(i; i < NUMBER_OF_AS; ++i)
{
if (NULL == (aV->a[i] = calloc(1,sizeof(A))))
{ report("Cannot allocate memory for As."); }

aV->a[i]->size = 0;
aV->a[i]->name[0] = 0;

for(j; j < NUMBER_OF_BS; ++j)
{
if (NULL == (aV->a[i]->b[j] = calloc(1,sizeof(B))))
{ report("Cannot allocate memory for Bs."); }

aV->a[i]->b[j]->size = 0;

for(k; k < NUMBER_OF_CS; ++k)
{
if (NULL == (aV->a[i]->b[j]->c[k] = calloc(1,sizeof(C))))
{ report("Cannot allocate memory for Cs."); }
}
}
}

aV->size = 0;

return aV;
//initializeProgramVector
}

int main (void)
{
AVector* aV;
aV = initializeAVector();


while(1)
{
static stringBundle string;
static char str1[81];
static char str2[81];
string.string1 = str1;
string.string2 = str2;

functionBundle funcbundle;
funcbundle.getCharacter = &getCharFromaGivenPort;
funcbundle.doSthingwithC = &handleCaGivenWay;
funcbundle.aV = aV;

activityFromCharacters(&string,&funcbundle);
}

//main
}

最佳答案

您的代码显示它没有任何错误...但我认为你在获取 doSthing 函数中的大小值时犯了错误。你在那里打印它的地址。所以专注于一些指针的东西..

关于c - 结构成员在通过后损坏但再次通过后未损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6954010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com