user-0 提问: 关于段错误的问题，求前辈解惑，非常感谢

回复:
user: user-1
content: 可以用gdb调试错误，死了之后看死的时候的函数位置。自己找用法去……

user: user-0
content: 引用 6 楼 Adol1111 的回复:这样说吧，在C++中，char *zh="";这个等价于const char *zh=""; 为什么等价，是因为要兼容老代码，但最好现在写成这样。如果你知道const什么意思的话，就应该知道，这样写zh是一个只读的指针。是不允许更改内容的。 如果你强行修改，就会造成非法的地址访问，也就是段错误。如果一定要使用指针，最好先用malloc动态分配下，或者用数组的形式。总之这样写不好，误人误己。  刚开始学的话，最好多了解下标准和好的编程习惯，不然习惯了以后想改就很麻烦了。  楼上写的代码都可以，不过你看仔细了，如果你输入的内容，超过分配的长度同样会出错。  #include <stdio.h>   int main (){     char *zh=0;     zh=(char *)malloc(sizeof(char)*20);//分配了20个空间     scanf("%s",zh);//%s是输入字符串，%c是单个字符     //scanf("%c",&zh); 这样用zh，应该是char类型，而不是char*     if(strcmp(zh,"good")==0){ //字符串要用strcmp比较，=表示赋值，不一样。                               //如果zh是刚才说的char类型，应该用zh=='g',和单个字符比较             printf("成功");     }     else{         printf("输入错误");     }     return 0; }  非常感谢，我终于懂了```因为看的不是入门书籍，所以看起来生涩难懂，所以想多写写，觉得可能会更容易理解一点，不过这里终于是懂了，非常感谢

user: user-2
content: 写的有点问题，改下： #include <stdio.h> #include<string.h> //strcmp要string头文件 int main (){     char *zh=0;     zh=(char *)malloc(sizeof(char)*20);     scanf("%s",zh);     if(strcmp(zh,"good")==0){              printf("成功");     }     else{         printf("输入错误");     }     free(zh);//和malloc对应，有malloc就要有对应的free     return 0; }

user: user-0
content: 引用 4 楼 u012527966 的回复:[quote=引用 2 楼 max_min_ 的回复:]  #include <stdio.h> #include <string.h>  int main(void) { 	char buf[10] = {0}; 	if (scanf("%s", buf) == 1) 	{ 		if(strcmp(buf,"good") == 0) 		{ 			printf(" You are success!\n"); 		} 		else  		    printf("You are failed!\n"); 	} 	 	return 0; } 上面的例子参考下！ 出现段错误是因为没有分配内存地址引起的！  这段代码我看明白了，但是关键是编译运行之后会出现同样的错误，段错误，核心已转储。求解，我检查了几遍真的没抄错。 还有strcmp这个函数是在string.h里面的吗？[/quote]  呃‵‵是我错了，忘记重新编译了

user: user-2
content: 这样说吧，在C++中，char *zh="";这个等价于const char *zh=""; 为什么等价，是因为要兼容老代码，但最好现在写成这样。如果你知道const什么意思的话，就应该知道，这样写zh是一个只读的指针。是不允许更改内容的。 如果你强行修改，就会造成非法的地址访问，也就是段错误。如果一定要使用指针，最好先用malloc动态分配下，或者用数组的形式。总之这样写不好，误人误己。  刚开始学的话，最好多了解下标准和好的编程习惯，不然习惯了以后想改就很麻烦了。  楼上写的代码都可以，不过你看仔细了，如果你输入的内容，超过分配的长度同样会出错。  #include <stdio.h>   int main (){     char *zh=0;     zh=(char *)malloc(sizeof(char)*20);//分配了20个空间     scanf("%s",zh);//%s是输入字符串，%c是单个字符     //scanf("%c",&zh); 这样用zh，应该是char类型，而不是char*     if(strcmp(zh,"good")==0){ //字符串要用strcmp比较，=表示赋值，不一样。                               //如果zh是刚才说的char类型，应该用zh=='g',和单个字符比较             printf("成功");     }     else{         printf("输入错误");     }     return 0; }

user: user-0
content: 引用 1 楼 hnwyllmm 的回复:void main (){     char *zh="";   // 存放数组需要内存，但是这个zh只是一个指针     scanf("%c",zh);// %c是输入一个字符，不是一个字符串，用%s     if(zh = "good"){  字符串比较用strcmp函数，‘=’是赋值不是比较             printf("成功");     }     else{         printf("输入错误");     } }  楼主的C基础没有看到，建议再多看点基础，按照教程做几道基础的练习题，包括数组、字符串和指针 因为才刚刚开始接触C语言，基础确实不怎样，但是在看数组和指针的时候很多东西不能一下子理解，可不可以在我代码里错误的地方写出修改方案？因为就算知道问题在哪里可能我一下子真的修改不好，非常感谢！

user: user-0
content: 引用 2 楼 max_min_ 的回复: #include <stdio.h> #include <string.h>  int main(void) { 	char buf[10] = {0}; 	if (scanf("%s", buf) == 1) 	{ 		if(strcmp(buf,"good") == 0) 		{ 			printf(" You are success!\n"); 		} 		else  		    printf("You are failed!\n"); 	} 	 	return 0; } 上面的例子参考下！ 出现段错误是因为没有分配内存地址引起的！  这段代码我看明白了，但是关键是编译运行之后会出现同样的错误，段错误，核心已转储。求解，我检查了几遍真的没抄错。 还有strcmp这个函数是在string.h里面的吗？

user: user-3
content: 非法访问内存，会出现段错误！ 1. char *zh="";//zh只是一个指针，而且这里又指向一个空字符串，空字符串是个数值常量，后文不能修改，你却尝试修改了 //如果作为存储字符，必须使用数组或者动态分配 char zh[32]=""; or char *zh = malloc(32);   2.采集字符串，使用的控制符是scanf("%s", zh);c是采集单个字符

user: user-4
content: #include <stdio.h> #include <string.h>  int main(void) { 	char buf[10] = {0}; 	if (scanf("%s", buf) == 1) 	{ 		if(strcmp(buf,"good") == 0) 		{ 			printf(" You are success!\n"); 		} 		else  		    printf("You are failed!\n"); 	} 	 	return 0; } 上面的例子参考下！ 出现段错误是因为没有分配内存地址引起的！

user: user-5
content: void main (){     char *zh="";   // 存放数组需要内存，但是这个zh只是一个指针     scanf("%c",zh);// %c是输入一个字符，不是一个字符串，用%s     if(zh = "good"){  字符串比较用strcmp函数，‘=’是赋值不是比较             printf("成功");     }     else{         printf("输入错误");     } }  楼主的C基础没有看到，建议再多看点基础，按照教程做几道基础的练习题，包括数组、字符串和指针