有一个名为'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'文件中提供了错误的值。 请帮我搞清楚。
答案 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));
它不会显示ptc
,stc
或ath
的声明。由于您要复制到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;