我尝试了以下程序:
#include <stdio.h>
char s1[] = "Global String";
char *s2 = "Another Global String";
main()
{
char s3[] = "Local String" ;
char *s4 = "Another Local String" ;
strcpy( s1, "New str" );
strcpy( s2, "New str" ); // causes seg fault
strcpy( s3, "New str" );
strcpy( s4, "New str" ); // causes seg fault
}
Run Code Online (Sandbox Code Playgroud)
s2并s4导致分段错误,大概是因为它们存储在只读数据段中。怎么会在文字字符串的指向s1和s3不崩溃?这是在 Ubuntu 上。
奇怪的是,s1, s2,s3和s4都可以修改,并且在 cygwin 上使用 gcc …
我读了几个类似的问题,C:字符指针和数组之间的差异,是什么个char []与char*S之间的区别?,char array []和char*array有什么区别?但他们似乎都不清楚我的怀疑.
我知道
char *s = "Hello world";
Run Code Online (Sandbox Code Playgroud)
使字符串不可变,而
char s[] = "Hello world";
Run Code Online (Sandbox Code Playgroud)
可以修改.
我怀疑的是,如果我这样做char stringA[LEN]; ,char* stringB[LEN];他们有什么不同吗?或者stringB在之前的情况下再次变得不可变?
是char a[] = {'a', '\0'}和char *b = "a"平等?
有什么不同?
请有人解释为什么以下C程序崩溃:
void changeChar(char *string);
int main(int argc, char *argv[])
{
char *test = "word";
changeChar(test);
return 0;
}
void changeChar(char *string) {
*string = 'A';
}
Run Code Online (Sandbox Code Playgroud)
而以下代码完美地运作:
void changeChar(char *string);
int main(int argc, char *argv[])
{
char test[] = "word";
changeChar(test);
return 0;
}
void changeChar(char *string) {
*string = 'A';
}
Run Code Online (Sandbox Code Playgroud) 这是我运行的程序:
#include <stdio.h>
int main(void)
{
int y = 1234;
char *p = &y;
int *j = &y;
printf("%d %d\n", *p, *j);
}
Run Code Online (Sandbox Code Playgroud)
我对输出有点困惑.我所看到的是:
-46 1234
Run Code Online (Sandbox Code Playgroud)
我把这个程序写成了一个实验,不知道它会输出什么.我期待可能有一个字节y.
这里发生了什么"幕后"?解除引用如何p给我-46?
正如其他人指出的那样,我必须进行明确的施法才能导致UB.我没有改变这一行char *p = &y;,char *p = (char *)&y;所以我没有使下面的答案无效.
此程序不会导致此处指出的任何UB行为.