【问题标题】:C - Two structs created in the same way, but with different values, why?C - 以相同方式创建的两个结构,但具有不同的值,为什么?
【发布时间】:2021-03-24 16:10:20
【问题描述】:

所以,基本上这篇文章末尾的代码是我第一次尝试实现一些并行队列。

我使用相同的函数 createBase() 创建了结构“fila1”和“fila2”,该函数使用“malloc”分配内存空间。

这两个结构都是以相同的方式创建的,并且似乎是正确创建的。但是,该函数打印“hellou”,但不打印“hi”,两者都应该打印。

尝试调试,发现当我的程序进入“while”循环时,第二个“fila2”改变了它的内存地址,也改变了它的孩子的值,它们不再指向“NULL”。我不明白为什么。 “fila1”仍然可以正常工作。

只是为了说明,在 while 循环之前(工作正常!):

之后程序经过 while 循环行(哦,不!):

哦,差点忘了,这是代码。 我用作输入命令 =“a”。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct Member {
        struct Member *next;
};


struct Base{
        struct Member *begin, *end;
};

//Funcoes
struct Base* createBase(){
        struct Base *new;
        new =  (struct Base*)malloc(sizeof(struct Base));
        if (new != NULL) { 
                new->begin = NULL;
                new->end = NULL; 
        }
        return new;
};


int main(void) {
        char command[1];
        struct Base *fila1, *fila2;
        struct Base *createBase();
        
        fila1 = createBase();
        fila2 = createBase();
        while(scanf("%s", &command) != EOF) {
                if (fila1->begin == NULL) {
                        printf("hellou");
                }
                if (fila2->begin == NULL) {
                        printf("hi");
                }

        }
        return 0;
}

【问题讨论】:

  • char command[1]; 很可能不足以容纳您的命令。
  • 可能是 file2->begin = NULL 中缺少的 = 吗?那应该是 ==
  • main中struct Base *createBase();这行的用意是什么?
  • @MortenJensen,createBase() 不初始化begin 成员吗?
  • scanf() 溢出 command 如果输入太长。尽管这更有可能导致段错误。在任何情况下,scanf() 在这里都不会做任何事情,因此您不妨将其删除,作为隔离问题的一部分。

标签: c


【解决方案1】:

正如@tkausl 和@ilkkachu 之前评论的那样,命令数组太小而无法包含命令本身。即使您的命令只有 1 个字符长(您说您输入的是命令“a”),请记住缓冲区至少包含两个字节:一个用于命令字符本身('a'),另一个用于 ' \0'(值为 0 的字符)终止字符串。

可能 scanf 将 'a' 存储在 command[0] 并尝试将终止的 '\0' 存储在不存在的 command[1] 中(因为 command 仅包含 1 个字节)。这个 '\0' 很可能是溢出命令并覆盖了fila2 的最后一个字节(注意它从 0xd0 变为 0x00,这正是 '\0' 的值)。

尽管我建议使用更安全的用户输入方法,例如 fgets(这需要您指示缓冲区大小,因此永远不会溢出)。

【讨论】:

  • 刚刚做了一个小的编辑,因为我没有读到你使用的命令的确切值。
【解决方案2】:

第一个条件fila1-&gt;begin == NULL 测试begin 成员是否为NULL - 并且是,因此出现打印输出。

第二个fila2-&gt;begin = NULL 赋值 NULL 给begin 成员,然后这个赋值的结果被转换成整数,按照if() 的要求。转换的整数结果为零,表示“假”,因此不会进行第二次打印输出。

【讨论】:

  • 事实上,这是一个错字。抱歉,已经修复了,但是还是不行=(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多