【问题标题】:Why does this code crash when I declare one more variable?为什么当我再声明一个变量时这段代码会崩溃?
【发布时间】:2012-09-02 13:53:32
【问题描述】:

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

【问题讨论】:

  • 每次使用时不要忘记测试scanf()是否成功读取了一个值。
  • 如果您发布代码,请使其尽可能干净...即删除不必要的注释掉代码。

标签: c compiler-construction struct scanf


【解决方案1】:
scanf("%s", palikka.mjono);

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


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

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

【讨论】:

  • 补充 cnicutar 的观点:您应该假设编译器在很长一段时间内都是完全正确的。虽然编译器不是没有错误的,但是在你学习 C 的过程中,你极不可能同时遇到错误。
  • 感谢您的帮助。我将字符串变量更改为 char* mjono[];它不再崩溃了。
  • " 我将字符串变量更改为 char* mjono[]; 它不再崩溃。"它可能不再崩溃,但它仍然是错误的。现在你有了一个指针数组,但仍然没有为字符串分配内存。
【解决方案2】:

扩展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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多