【问题标题】:Segmentation fault after program runs correctly程序正确运行后出现分段错误
【发布时间】:2021-02-21 06:18:48
【问题描述】:

我正在用 C 语言为学校做一个项目,但遇到了一个奇怪的问题。 我的程序运行正常,但在最后一个命令之后,我得到了一个分段错误,我不明白为什么。

这是我的代码:(抱歉葡萄牙版)

void main_args(int argc, char* argv[], struct main_data* data)
{   
    char *str;
    for(int i = 1; i < argc; i++)
    {   
        strcat(str, argv[i]);
        strcat(str, " ");
    }
    if(argc != 6 || sscanf(str, "%d %d %d %d %d", &data->max_ops, &data->buffers_size, &data->n_clients, &data->n_proxies, &data->n_servers) != 5)
    {   
        if(argc == 1){
            printf("Uso: sovaccines max_ops buffers_size n_clients n_proxies n_servers\n");
            printf("Exemplo: ./bin/sovaccines 10 10 1 1 1\n");
        }else{
            printf("Parâmetros incorretos! Exemplo de uso: ./bin/sovaccines 10 10 1 1 1\n");
        }
    }

}


int main(int argc, char* argv[]){
    struct main_data* aux = malloc(sizeof(struct main_data));
        
    main_args(argc, argv, aux);
    printf("primeiro: %d\n", aux->max_ops);
    printf("segundo: %d\n", aux->buffers_size);
    printf("terceiro: %d\n", aux->n_clients);
    printf("quarto: %d\n", aux->n_proxies);
    printf("quinto: %d\n", aux->n_servers);
    free(aux);
    printf("What the hell\n");
    return 0;
}

输出如下:

希望有人可以帮助我。

【问题讨论】:

标签: c segmentation-fault


【解决方案1】:

您遇到了段错误,因为从未为 char *str 分配一些内存。您需要以正确的方式对其进行初始化:

// Replace 128 with your preferable number of chars
char *str = malloc(sizeof(char) * 128);

注意:当您像这样手动分配内存时,它也需要在使用结束后立即释放。这可以通过使用free(ptr) 来完成:

// After usage of 'str'
free(str);

最后,在strcat()使用前用某个字符初始化新创建的字符串:

str[0] = '\0'; // Initializing the first character with a null-terminator

在此之后,您将不再遇到段错误。

这是demo

【讨论】:

  • 应该不需要转换 malloc 返回值。
  • @dxiv 编辑完成。看看这个。
【解决方案2】:

在函数 main_args 中, 您将 str 声明为指针,但没有为其分配内存来存储。 采用 int ArgsStringSize = 100; char *str = (char *)malloc(ArgsStringSize); 或者 字符 str[1000];

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 2013-09-13
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2021-07-18
    • 2013-05-04
    • 2012-09-11
    相关资源
    最近更新 更多