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

时间:2012-09-02 13:53:32

标签: c compiler-construction struct scanf

这是我的代码。它在我注释掉“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编译器是否已损坏或可能是什么问题?

2 个答案:

答案 0 :(得分:4)

scanf("%s", palikka.mjono);

你没有让mjono指向任何东西,所以写它当然是非法的 - 未定义的行为。做这样的事情会导致不稳定的行为:程序“无法正常工作”或“失败”。


  

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

认为您使用的工具是问题很少有建设性。

答案 1 :(得分: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;