为什么当我再声明一个变量时这段代码会崩溃?

问题描述 投票:0回答:2

这是我的代码。当我注释掉“luetut”变量时它就起作用了。 但是,当我按如下方式编译时,当程序应该打印变量时,我会出现分段错误。这有什么意义呢?当我尝试进行调试构建时,出现了一些完全奇怪的东西(这个和那个的多个定义)。

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

typedef struct rakenne
{
    int luku;
    float liukuluku;
    char* mjono;
}   Rakenne;

int main(int argc, char *argv[])
{
    int luetut = 0;
    Rakenne palikka;
//  Rakenne palikka, *palikkaosoitin;
//  palikkaosoitin = &palikka;

//  while(luetut < 1)
//  {
        printf("Anna luku:\n");
        scanf("%d", &palikka.luku);
//  }   luetut = 0;
//  while(luetut < 1)
//  {
        printf("Anna liukuluku:\n");
        scanf("%f", &palikka.liukuluku);
//  }   luetut = 0;
    printf("Anna merkkijono:\n");
    scanf("%s", palikka.mjono);

    printf("%i\t%.3f\t%s\n", palikka.luku, palikka.liukuluku, palikka.mjono);

    return 0;
}

那么,我的 gcc 编译器是否损坏或者可能是什么问题?

c struct scanf
2个回答
4
投票
scanf("%s", palikka.mjono);

你没有让

mjono
指向任何东西,所以写入它当然是非法的 - 未定义的行为。这样做会导致不稳定的行为:程序无明显原因“工作”或“失败”。


那么,我的 gcc 编译器是否损坏了或者可能是什么问题

认为你正在使用的工具是问题所在是没有建设性的。


1
投票

扩展 cnicutars 答案,修复方法是为

palikka.mjono
分配一些内存。

类似这样的:

#define SIZE     40   // or whatever you need.
palikka.mjono = malloc( sizeof(char) * SIZE );

以后别忘了

free
那个记忆:

free( palikka.mjono ); 

或者,如果您知道字符串的最大大小是多少,只需将结构定义为:

typedef struct rakenne
{
    int luku;
    float liukuluku;
    char mjono[SIZE];
}   Rakenne;
© www.soinside.com 2019 - 2024. All rights reserved.