写入内存时,在scanf C中使用char [] vs char *

时间:2016-10-23 14:34:03

标签: c scanf

我正在尝试使用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);
}
`

2 个答案:

答案 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个字符。