用户定义的全局变量在C中的两个不同文件中给出不同的值

时间:2012-12-12 07:10:58

标签: c file struct user-defined-types

有一个名为'AAA.h'的头文件。在这个头文件中,我们定义了一个名为lrd的结构,它看起来像:

struct lrd
{   
int     tc;
char    ptc[5];
char    stc[5];
char    ath[5];
int     vc;
};
struct lrd lr;

此头文件'AAA.h'包含在两个不同的文件名'BBB.c'和'CCC.c'中。我们在'BBB.c'文件中为结构变量lr分配了如下值:

lr.tc=tc;
memcpy(lr.ptc,ptc,sizeof(ptc));
memcpy(lr.stc,stc,sizeof(stc));
memcpy(lr.ath,ath,sizeof(ath));
lr.vc=vc;

以上源变量从数据库中获取值。我们在'CCC.c'文件中使用结构变量lr。我们使用结构lrd变量如下:

char *ptc()
{
    sprintf(str, "lr.ptc(%s)", lr.ptc);
    trace(str);
    return lr.ptc;
}
char *stc()
{
    sprintf(str, "lr.stc(%s)", lr.stc);
    trace(str);
    return lr.stc;
}

变量stc在'CCC.c'文件中提供了错误的值。 请帮我搞清楚。

3 个答案:

答案 0 :(得分:1)

查看benjarobin说的内容。我只是向你展示一个小小的足迹

AAA.h

#ifndef _AAA_H
struct abc
{
 int x;
 char *y;
 char *Z;
};


extern struct abc p;

extern void assign(void);
extern void display (void);
#endif

CCC.c

#include <stdio.h>
#include "AAA.h"

struct abc p; // Deceleration of p
void assign ()
{
    p.x=20;
    p.y="abcd";
    p.Z="xyz0";

    return;
}

BBB.c

#include <stdio.h>
#include "AAA.h"


void display (void)
{
    printf("x = %d, y =%s, z=%s",p.x,p.y,p.Z);

}

DDD.c包含main function

#include <stdio.h>
#include "AAA.h"
void main ()
{
    printf("\n\nAssigning Values\n\n");
    assign ();

    printf("\n\nIN BBB.c\n\n");
    display ();

    printf("\n\nIN MAIN\n\n");
    printf("x = %d, y =%s, z=%s",p.x,p.y,p.Z);


}

输出

Assigning Values



IN BBB.c

x = 20, y =abcd, z=xyz0

IN MAIN

x = 20, y =abcd, z=xyz0

答案 1 :(得分:1)

您的代码显示:

memcpy(lr.ptc,ptc,sizeof(ptc));
memcpy(lr.stc,stc,sizeof(stc));
memcpy(lr.ath,ath,sizeof(ath));

它不会显示ptcstcath的声明。由于您要复制到lr.ptc等,sizeof()的操作数应为lr.ptc等,而不是源的大小。或者,如果你非常小心,那么两种尺寸中的最小值。

您可以/应该使用以下方法对其进行调试:

printf("%d (%s)(%s)(%s) %d\n", lr.tc, lr.ptc, lr.stc, lr.ath, lr.vc);
分配后立即

。如果显示错误的值,则表示问题出在分配中。如果它显示正确的值,那么你可以开始寻找杂散指针和其他类似的可怕问题。

没有证据证明这是问题,因为你没有制作SSCCE(Short, Self-Contained, Correct Example)。具体来说,您只生成了代码片段,而不是三个源文件的集成集合(尽管我们可以根据给定的信息推断出标头)。如果没有实际证明问题的代码(所有这些,包括所有变量和函数的定义 - 但不包括任何多余的材料),我们只能推测。

答案 2 :(得分:0)

应避免使用外部变量,但如果您仍想使用全局变量,则应执行以下操作:

  • 在.c文件中声明变量

    struct lrd lr;

  • 在.h(AAA.h)中添加外部定义

    外部结构lrd lr;