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

C 分段错误(核心转储)-如何修复我的代码?,c,pointers,segmentation-fault,coredump,C,Pointers,Segmentation Fault,Coredump,程序在字符串中找到一个包含最小ascii码的字符,并将其输出。我的问题在消息中:分段错误(核心转储)。为什么会发生,发生在哪里? 谢谢你的关注 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { char* str = NULL; int* mincode = NULL; int* count = NULL;

程序在字符串中找到一个包含最小ascii码的字符,并将其输出。我的问题在消息中:分段错误(核心转储)。为什么会发生,发生在哪里? 谢谢你的关注

#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;
}
#包括
#包括
#包括
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));
计数=(int*)malloc(1*sizeof(int));
if(NULL==str | | NULL==mincode | | NULL==count){
printf(“Alloc错误”);
返回退出失败;
}
fgets(str,50,stdin);
printf(“您的字符串:”);
put(str);
*mincode=(int)(str[*count]);
*mincodeChar=*(str+*计数);
对于(*count=0;str[*count]!='\0';(*count)++){
如果((int)str[*count]<(*mincode)){
(*mincode)=(int)str[*count];
mincodeChar=(str+*计数);
printf(“%c”,*mincodeChar);
}
}
printf(“您的角色:”);
printf(“%c”,*mincodeChar);
自由基(str);
免费(明码);
免费(计数);
返回退出成功;
}
取消对空指针的引用

可以从中吸取的教训是:

  • 始终尽快将变量初始化为有效值
  • 取消引用前检查指针
  • 取消对空指针的引用

    可以从中吸取的教训是:

  • 始终尽快将变量初始化为有效值
  • 取消引用前检查指针
  • 没有检查但是

    *mincode = (int)(str[*count]);
    *mincodeChar = *(str + *count);
    
    计数包含未初始化的值。所以它可以是0,更可能是492892911039。。。从不理解未初始化变量的随机性。在本例中,您试图在492892911039打开该位置。。。。西格夫?如果需要0或明确地将其设置为0,则调用calloc()。然后和其他人一样。。。为什么只分配一个变量。。。这是可能发生的,但对于外部约束,一个例子是当您调用一些只接受void*…的API函数时。。。但是什么时候可以避免是最好避免的。不仅仅是因为懒惰。malloc的大多数实现都是列表,所以分配的越多,这个列表就越长,所以每次新的分配都必须进行评分。所以它会减慢malloc()的速度。当然不是在这种情况下。。。但是最好分配几个大的内存块,而不是很多小的

    没有检查但是

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

    计数包含未初始化的值。所以它可以是0,更可能是492892911039。。。从不理解未初始化变量的随机性。在本例中,您试图在492892911039打开该位置。。。。西格夫?如果需要0或明确地将其设置为0,则调用calloc()。然后和其他人一样。。。为什么只分配一个变量。。。这是可能发生的,但对于外部约束,一个例子是当您调用一些只接受void*…的API函数时。。。但是什么时候可以避免是最好避免的。不仅仅是因为懒惰。malloc的大多数实现都是列表,所以分配的越多,这个列表就越长,所以每次新的分配都必须进行评分。所以它会减慢malloc()的速度。当然不是在这种情况下。。。但是最好分配几个大内存块,而不是很多小内存块

    当编译时大小固定时,为什么要动态分配内存?特别是,为什么要为一个
    int
    分配内存?为什么不在
    *mincode=(int)(str[*count])处使用一个简单的
    int
    变量
    *count
    未初始化。顺便问一下,为什么会有这么多动态内存分配?拥有
    int*count
    比普通的
    int-count
    更好吗?这是在任务中写的-不要使用普通的var。所以,这就是为什么我没有发布那个评论,但你必须记住,
    malloc
    只分配内存,它不会以任何方式初始化它。因此,当您在循环之前使用
    *count
    时,您会得到一个不确定的值,这可能是非常错误的,并且您可能会超出为
    str
    分配的内存的范围。当编译时大小固定时,为什么要动态分配内存?特别是,为什么要为一个
    int
    分配内存?为什么不在
    *mincode=(int)(str[*count])处使用一个简单的
    int
    变量
    *count
    未初始化。顺便问一下,为什么会有这么多动态内存分配?拥有
    int*count
    比普通的
    int-count
    更好吗?这是在任务中写的-不要使用普通的var。所以,这就是为什么我没有发布那个评论,但你必须记住,
    malloc
    只分配内存,它不会以任何方式初始化它。因此,当您在循环之前使用
    *count
    时,您会得到一个不确定的值,这可能是非常错误的,并且您可能超出了为
    str
    分配的内存范围;然后我取消了对mincodeChar的引用。为什么它不起作用呢?它会引起问题吗?@Sergei,
    *mincodeChar=*(str+*count)
    mincodeChar=(str+*count)不同。第一个访问指向的值,第二个访问指针;然后我取消了对mincodeChar的引用。为什么它不起作用呢?它会引起问题吗?@Sergei,
    *mincodeChar=*(str+*count)
    mincodeChar=(str+*count)不同。第一个访问指向的值,第二个访问指针。