1

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

4

2 回答 2

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

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


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

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

于 2012-09-02T13:55:50.523 回答
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;
于 2012-09-02T16:46:20.017 回答