(从原始问题更改了变量名称以适合实际代码)我是 C 新手,我正在实现一个队列。错误在于static int head=0
变量。每次调用 dequeue() 时它都会增加 1。当队列出队并调用函数 get_person() 时,似乎会发生错误。那么 head-variable 似乎得到了一个高随机数,例如23423449。我不知道这是从哪里来的。但是,如果我摆脱“静态”关键字,所以变量被声明为int head=0
,它工作正常。怎么来的?
4 回答
在包含的文件顶部使用“全局”变量:
static int variable1=0
这清楚地表明,您不了解static
关键字在全局范围内的含义。在全局范围内,在函数之外,静态意味着该变量仅对已定义该变量的编译单元内的代码可见。
现在,如果您在标头中定义静态变量,则包含该标头的每个编译单元都将拥有自己的该名称的变量。因此,您的程序充满了许多同名的变量,每个变量都特定于它所在的编译单元。
extern
我认为您真正想要的是标题中的非静态声明,并且正是一个实际定义变量的编译单元。
我认为您超出了您的人员数组
strcpy 函数之一是超出 person 对象中缓冲区的边界,并覆盖 head 变量。我猜 tail 和 nbr_elem 也会去。
您应该检查要复制的字符数是否不超过缓冲区长度,或使用 strncpy。
您在调用 strcpy 时没有检查您尝试写入的值是否真正适合 person 结构内分配的空间。
最有可能发生的是您正在超出分配的内存进行写入,而您的 strcpy 实际上正在覆盖 head 的值。strcpy 将继续写入,直到遇到空终止符 ('\0')。
如果您要在 valgrind(在大型程序中查找此类问题的有用工具)中运行它,它可能会告诉您发生了无效写入。
C假设您知道自己在做什么,只要您可以访问内存,就可以随意使用它:)
如果你在 file 中声明了一个全局静态变量A.c
,则意味着这个变量只在这个A.c
文件的范围内可用。请参阅:http ://en.wikipedia.org/wiki/Static_variable
由于您没有发布任何代码,并且您在不同的文件中使用相同的变量(例如B.c
),因此它似乎在调用一个undefined behavior
,它解释了您的程序正在打印的随机数。
如果您希望在不同的 .c 文件中使用该变量,则不应将其设为静态。