分段错误(核心转储) - 如何修复我的代码?

时间:2016-11-21 15:03:51

标签: c pointers segmentation-fault coredump

程序在字符串中找到具有最小ascii代码的char并输出它。我的问题在于消息:分段错误(核心转储)。它为什么以及在哪里发生? 谢谢你的关注。

#include <stdio.h>    
#include <string.h>    
#include <stdlib.h>    

int main(void) {    

char* str = NULL;    
int* mincode = NULL;    
int* count = NULL;    
char* mincodeChar = NULL;


 str = (char *) malloc(50 * sizeof(char));
 mincode = (int *) malloc(1 * sizeof(int));
 count = (int *) malloc(1 * sizeof(int));

 if (NULL == str || NULL == mincode || NULL == count){
        printf("Alloc error");
        return EXIT_FAILURE;
    }

fgets(str, 50, stdin);

printf("your string: ");
puts(str);

*mincode = (int)(str[*count]);
*mincodeChar = *(str + *count);

 for (*count = 0; str[*count] != '\0'; (*count)++) {

    if( (int)str[*count] < (*mincode)) {
    (*mincode) = (int)str[*count];
    mincodeChar = (str + *count);
    printf("%c", *mincodeChar);
    }
}

printf("your character: ");
printf("%c", *mincodeChar);

free(str);
free(mincode);
free(count);

return EXIT_SUCCESS;
}

2 个答案:

答案 0 :(得分:4)

char* mincodeChar = NULL;
....
*mincodeChar = *(str + *count);

取消引用NULL指针。

从中吸取的教训是:

  1. 始终尽快将变量初始化为有效值。
  2. 在解除引用之前检查指针。

答案 1 :(得分:0)

没检查,但

*mincode = (int)(str[*count]);
*mincodeChar = *(str + *count);

count 包含未初始化的值。所以它可能是0,更可能是像492892911039 ...从未理解未初始化变量的随机性。在这种情况下,您正试图在492892911039开设该职位.... SIGSEGV?如果你想要0或明确地将它设置为0或者更确切地说malloc()调用calloc()。然后和其他人一样......为什么要分配一个变量? ...它可能发生,但是对于外部约束,一个例子就是当你调用一些只接受void *的API函数时......但是可以避免的时候更好地避免。不只是懒惰。 malloc的大多数实现都是list。所以你分配更多的long会变成这个列表,每个新的分配都必须得分。所以有点它会减慢你的malloc()。在这种情况下当然不是......但是最好分配一些大块内存而不是很小的