【发布时间】:2016-10-24 00:09:15
【问题描述】:
我正在尝试使用char* 数据类型来存储来自用户的字符串,代码编译正常,但在执行scanf 指令时失败,
固定数组char[10] 工作顺利,但我想知道如何改用char*。
bouclesCon.c
#include "bouclesCon.h"
/... ... ...
void func_While(){
//char message[10] ="hey" ;//good
char*message="hey";//copiles but fails to execute
while(strcmp(message,"sortir")!=0){
printf("vous avez ecrit %s\n",message);
scanf("%s",message);
}
}
main.c
#include"bouclesCon.h"
int main()
{
func_While();
return 0;
}
更新
正如 carveone 和 Igor 所解释的,问题与使用 char 指针 (char*) 在运行时通过 scanf() 写入用户输入时分配足够的内存有关,相比之下,数组处理内存的方式不同。
解决方案工作代码:
`void func_While(){
//char message[10] ="hey" ;//good
char*message="hey";//copiles and execute fine!!
message=malloc(10);
if(message==NULL){
printf("error\n");
}else{
while(strcmp(message,"sortir")!=0){
printf("vous avez ecrit %s\n",message);
scanf("%s",message);
}
}
free(message);
}
`
【问题讨论】:
-
"hey"是const char[4]类型;尝试写入由字符串文字占用的内存会表现出未定义的行为。许多编译器实际上将字符串文字存储在标记为只读的内存段中。 -
数组不是指针,反之亦然,但在某些用法中,它会转换为第一个元素。阅读一本好的 C 书籍来学习这个重要的概念。