【问题标题】:User defined global variable gives different value in two different files in C用户定义的全局变量在 C 中的两个不同文件中给出不同的值
【发布时间】:2012-12-12 07:10:57
【问题描述】:

有一个名为“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”文件中给出了错误的值。 请帮我弄清楚。

【问题讨论】:

  • 你使用的是哪个编译器??
  • 那么你需要在这里写一个SSCCE。我们真的无法猜测出了什么问题。
  • @JoachimPileborg:他可能正在使用一个通过“通用”方法授予许可的系统,但它并不严格符合标准。 (ISO/IEC 9899:2011, Annex J, §J.5.11 多个外部定义 对象标识符可能有多个外部定义,有或没有关键字 extern 的显式使用;如果定义不一致,或者初始化了多个,则行为未定义 (6.9.2)。) 这是一种扩展——不是标准,但被标准认可。跨度>
  • 请参阅What are extern variables in C,详细了解如何执行所有这些操作。
  • 你能展示分配和使用变量的代码吗?如果您使用带有y 的字符串函数,您是否正确地以空值终止它?

标签: c file struct user-defined-types


【解决方案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

【讨论】:

  • 您将struct 的内容更改为使用指针而不是小数组。这大大改变了事情(您可以使用指针分配而不是需要我最初要评论的strcpy()memcpy())。你是对的;这大致是我们从 OP 那里需要的,所以 +1。
【解决方案2】:

您的代码显示:

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)。具体来说,您只生成了代码片段,而不是三个源文件的集成集(尽管我们可以从给定的信息中推断出标题)。如果没有实际演示问题的代码(所有这些,包括所有变量和函数的定义——但不包括任何多余的材料),我们只能推测。

【讨论】:

    【解决方案3】:

    应该避免使用外部变量,但如果你仍然想使用全局变量,你应该这样做:

    • 在 .c 文件中声明变量

      结构 lrd lr;

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

      外部结构 lrd lr;

    【讨论】:

      猜你喜欢
      • 2013-07-21
      • 1970-01-01
      • 2012-08-21
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2020-06-29
      • 2021-02-24
      相关资源
      最近更新 更多