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