我正在尝试使用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);
}
`
答案 0 :(得分:2)
正如Igor Tandetnik在他的评论中所说的那样,尝试写入字符串文字占用的内存会出现未定义的行为。
这一行:
char*message="hey";
是问题所在。字符串"嘿"可能在只读内存中但可能不是 - 编译器理论上可以在堆栈上分配4个字节并将消息指向它。在这种情况下,您可以在粉碎堆栈之前写入4个字节。
最好不要猜测和使用:
const char*message="hey";
如果您需要写信息,请使用您已经完成的数组;指针和数组是可以互换的(但不相同,请参阅C FAQ),或分配适当的内存量:
char *message;
message = malloc(100); /* 100 bytes allocated */
if (message == NULL) /* The allocation failed */
...error...
/* Write to message */
free(message); /* Free the 100 bytes */
答案 1 :(得分:0)
这是char-pointer和char数组之间的区别: 当声明以下代码时,正如Igor Tandetnik所说,你正在分配一个const char [4] = {' k',' e',' y',& #39; \ 0' };在软件的只读区域。
char*message="hey";
当声明以下代码时,你在堆栈中分配一个char [10](可写)并用数组{' k',' e',&#初始化它39; y',' \ 0' ......' \ 0' };
char message[10] ="hey" ;
小心,第二次使用将起作用,而用户输入的长度保持小于9个字符。