程序正常运行后出现段错误
Segmentation fault after program runs correctly
我正在用 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;
}
输出是这样的:
希望有人能帮助我。
你遇到了段错误,因为 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] = '[=12=]'; // Initializing the first character with a null-terminator
此后,您将不再遇到段错误。
这里是 demo。
在函数内 main_args,
您将 str 声明为指针,但没有为其分配内存来存储。
采用
int ArgsStringSize = 100;
char *str = (char *)malloc(ArgsStringSize);
要么
字符 str[1000];
我正在用 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;
}
输出是这样的:
希望有人能帮助我。
你遇到了段错误,因为 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] = '[=12=]'; // Initializing the first character with a null-terminator
此后,您将不再遇到段错误。
这里是 demo。
在函数内 main_args, 您将 str 声明为指针,但没有为其分配内存来存储。 采用 int ArgsStringSize = 100; char *str = (char *)malloc(ArgsStringSize); 要么 字符 str[1000];