C结构即使在正确初始化后也打印错误的值
在下面的程序中,我正确地为指向指针的指针分配内存,然后正确地分配单个指针和设置值,即使我将垃圾值获取给其中一个结构成员。我不明白我到底错在哪里 以下程序的示例输出为:C结构即使在正确初始化后也打印错误的值,c,C,在下面的程序中,我正确地为指向指针的指针分配内存,然后正确地分配单个指针和设置值,即使我将垃圾值获取给其中一个结构成员。我不明白我到底错在哪里 以下程序的示例输出为: ***CK: H2 nSupport: 0 CK: H2 nSupport: 1303643608 CK: FR2 nSupport: 0 CK: H2 nSupport: 1303643608 CK: FR2 nSupport: 0 ***CK: SP2 nSupport: 0 我不明白我是如何得到值1303643608的
***CK: H2 nSupport: 0
CK: H2 nSupport: 1303643608
CK: FR2 nSupport: 0
CK: H2 nSupport: 1303643608
CK: FR2 nSupport: 0
***CK: SP2 nSupport: 0
我不明白我是如何得到值1303643608的,尽管它在开始时设置正确
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NOK 15
#define ML 100
typedef struct sample_test_for_ties_t
{
char sender[NOK];
char receiver[NOK];
char message[ML];
}sample_test_for_ties;
typedef struct CUOfS_t{
char cK[NOK];
char eK[NOK];
char nK[NOK];
char AL[ML];
int nSupport;
}CUOfS;
CUOfS **Btenders = NULL;
sample_test_for_ties test_ties[] = {
{"H2","ICY", "fmaabghijklmmcdenoopqrstuvwxyz"},
{"FR2","AIY", "fmaabghijklmmcdenoopqrstuvwxyz"},
{"SP2","LAY", "fmaabghijklmmcdenoopqrstuvwxyz"},
{"H30","ICY", "fmaabghijklmmcdenoopqrstuvwxyz"},
{"F30","AIY", "fmaabghijklmmcdenoopqrstuvwxyz"},
{"W30","LAY", "fmaabghijklmmcdenoopqrstuvwxyz"},
};
void InitBtenders(int numOfBCtenders)
{
int count =0;
if(!Btenders)
{
if(Btenders = (CUOfS **)malloc(sizeof (**Btenders) * numOfBCtenders))
{
while(count < numOfBCtenders)
{
Btenders[count] = NULL;
count++;
}
}
else
{
printf("Malloc failed\n");
}
}
}
void freeBtenders(int numOfBCtenders)
{
int count =0;
if(Btenders)
{
while(count<numOfBCtenders)
{
if(Btenders[count]) {
free(Btenders[count]);
Btenders[count] = NULL;
}
count++;
}
free(Btenders);
Btenders = NULL;
}
}
void UpdateBtendersInfo(char *aContenders)
{
static int counter =0;
if(Btenders)
{
if(Btenders[counter] == NULL) {
Btenders[counter] = (CUOfS *)malloc(sizeof (Btenders[counter]));
if(Btenders[counter])
{
strcpy(Btenders[counter]->cK,aContenders);
strcpy(Btenders[counter]->eK,"\0");
strcpy(Btenders[counter]->nK,"\0");
memset(Btenders[counter]->AL,0,sizeof(Btenders[counter]->AL));
Btenders[counter]->nSupport = 0;
counter++;
}
else
{
printf("Insufficient memory for Btender\n");
}
}
}
else
{
printf("Looks like memory not allocated for Btenders\n");
}
int count =0;
while(count <counter && Btenders[count])
{
printf("***CK: %s nSupport: %d\n",Btenders[count]->cK,Btenders[count]->nSupport);
count++;
}
printf("\n");
}
int main()
{
int numOfBCtenders = 3;
int noc =0;
InitBtenders(numOfBCtenders);
while(noc < numOfBCtenders)
{
UpdateBtendersInfo(test_ties[noc].sender);
noc++;
}
freeBtenders(numOfBCtenders);
return 0;
}
但是我越来越
***CK: H2 nSupport: 1303643608
为
b终端分配内存的方式不正确
Btenders = (CUOfS **)malloc(sizeof (**Btenders) * numOfBCtenders) // WRONG
sizeof(**b主键)
与sizeof(CUOfS)
相同,但您需要sizeof(CUOfS*)
:
同样适用于:
Btenders[counter] = (CUOfS *)malloc(sizeof (Btenders[counter])); // WRONG
sizeof(Btenders[counter])
与sizeof(CUOfS*)
相同,但您需要sizeof(CUOfS)
:
不要垃圾邮件语言标签!如果你的问题是关于C,不要包括C++、java或Python的标签。注意,抱歉,这是我的第一篇文章,我认为StActFoad通常是在问。<代码>(Cufs**)Malc(siZoof(*bbduls:*NoMubcTeNeDrices))< /C>是错误的。首先是你;其次,sizeof(**Btenders)
相当于sizeof(CUOfS)
,使用一个星号表示多个星号。在一个不相关的注释中,将空指针传递到是有效的。最好对循环使用,而不是,而循环:for(int count=0;count
而不是使用while
循环将循环控件分布在3行上。
Btenders = (CUOfS **)malloc(sizeof (*Btenders) * numOfBCtenders) // FIXED
Btenders[counter] = (CUOfS *)malloc(sizeof (Btenders[counter])); // WRONG
Btenders[counter] = (CUOfS *)malloc(sizeof (*(Btenders[counter]))); // FIXED