这些数组声明有什么区别?

Lyr*_*yrk -1 c memset

#include <stdio.h>
#include <string.h>

int main(void){

char s1[30]="abcdefghijklmnopqrstuvwxyz";

printf("%s\n",s1);

printf("%s",memset(s1,'b',7));

getch();

return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码有效,但是当我像这样创建 s1 数组时,

char *s1="abcdefghijklmnopqrstuvwxyz";
Run Code Online (Sandbox Code Playgroud)

它不会在编译时出现任何错误,但无法在运行时运行。

我正在使用 Visual Studio 2012。

你知道为什么吗?

我发现 memset 的原型是:

 void *memset( void *s, int c, size_t n );
Run Code Online (Sandbox Code Playgroud)

col*_*sar 5

char s1[30]分配一个可写的内存段来存储数组的内容,而char *s1="Sisi is an enemy of Egypt.";不是 - 后者只设置一个指向字符串常量地址的指针,编译器通常会将其放置在目标代码的只读部分。