分段错误(核心转储)错误 访问动态数组中的元素



我想从用户那里获取一个字符串,将其打印出来,并访问其第一个字符,但使用以下代码我得到

分段错误(核心转储)

法典

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 #define GROW_BY 10
int main(){
   char *str_p, *next_p, *tmp_p;
   int ch, need, chars_read = 0;
   if(GROW_BY < 2){
    fprintf(stderr, "Growth constant is too smalln");
    exit(EXIT_FAILURE);
}
str_p = (char *)malloc(GROW_BY);
next_p = str_p;
while((ch = getchar()) != EOF){
    if(ch == 'n'){
        printf("%sn", str_p);  
            //Here is the error I also tried *(str_p + 0), (*str_p)[0]
        printf("%sn", str_p[0]);
        free(str_p);
        str_p = (char *)malloc(GROW_BY);
        next_p = str_p;
        chars_read = 0;
        continue;
    }
    if(chars_read == GROW_BY - 1){
        *next_p = 0;
        need = next_p - str_p + 1;
        tmp_p = (char *)malloc(need + GROW_BY);
        if(tmp_p == NULL){
            fprintf(stderr, "No initial storen");
            exit(EXIT_FAILURE);
        }
        strcpy(tmp_p, str_p);
        free(str_p);
        str_p = tmp_p;
        next_p = str_p + need - 1;
        chars_read = 0;
    }
    *next_p++ = ch;
    chars_read++;
}
exit(EXIT_SUCCESS);

}

str_p[0]

字符而不是字符串

所以你应该使用%c

printf("%cn", str_p[0]);

发生这种情况是因为变量参数没有类型安全,printf()中,如果格式说明符错误,代码将从内存中读取无效结果,可能会崩溃。

帮助您进行调试的一个有用提示是启用编译器警告,例如在 GCC 中:

gcc -Wall main.c -o main

这将为您的程序显示以下警告。

warning: format specifies type 'char *' but the argument has type 'char' [-Wformat]
        printf("%sn", str_p[0]);
                ~~     ^~~~~~~~
                %c
1 warning generated.

强烈建议使用-Wall标志来捕获程序中的一些麻烦。

相关内容

  • 没有找到相关文章

最新更新