以下代码在第2行接收seg错误:
char *str = "string";
str[0] = 'z'; // could be also written as *str = 'z'
printf("%s\n", str);
Run Code Online (Sandbox Code Playgroud)
虽然这非常有效:
char str[] = "string";
str[0] = 'z';
printf("%s\n", str);
Run Code Online (Sandbox Code Playgroud)
经过MSVC和GCC测试.
我知道我可能会用这个问题击败死马,但我有点困惑,我还没有找到SO或谷歌的确切答案(我有信心是对的 - 这里有太多的信息在C字符串上筛选).另外,我已经将它标记为C++,因为这是我感兴趣的,即使我们特别谈论的是C风格的字符串.
在这种情况下:
char const a* = "hello";
char const b[] = "goodbye";
Run Code Online (Sandbox Code Playgroud)
我本来以为"你好"和"再见"是不可变的字符串,因为它们来自应衰减到一个char*常量字符串常量.
我已经看到了,在这种特殊情况下,虽然,改变"你好"将是不确定的,同时改变"再见"就可以了,假设你剥去从B数组常量性.
我假设在b的情况下字符串是可变的,因为它存储在用户定义的数组中.
在这种情况下,你好,再见不同吗? 在这个例子中,由于某些原因,再见不是字符串文字.另外,如果再见不是字符串文字,我可以假设它不在全局内存中,并且在编译时间之后对它的唯一引用是留在用户数组单元格中吗?
// ExampleCodes.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<stdio.h>
#include<iostream>
using namespace std;
char* stringReverse(char* s)
{
char temp, *p,*q;
q = s;
while( *(++q));
for( p = s; p < --q; p++)
{
temp = *p;
*p = *q;
*q = temp;
}
return s;
}
int _tmain(int argc, _TCHAR* argv[])
{
stringReverse("StringReverse");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 可能的重复:
为什么简单的C代码会收到分段错误?
修改C字符串常量?
为什么此代码会产生访问冲突?
int main()
{
char* myString = "5";
*myString = 'e'; // Crash
return 0;
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
为什么在写入字符串时会出现分段错误?
我有以下程序:
char *s = "abcdf";
char s1[50] = "abcdf";
s1[0] = 'Q'; // Line 1
s[0] = 'P'; // Line 2
Run Code Online (Sandbox Code Playgroud)
为什么Line 1
工作正常并Line 2
导致程序崩溃?
可能重复:
修改C字符串常量?
你能解释为什么我在上述线路上遇到访问冲突吗?我猜这是我的进程内存,我可以访问和更改它的内容.
#include <stdio.h>
int main()
{
char* list[5]={"An","exam","on","Hall oween","night!!!!"};
char **p;
p=list;
*(*(p+1)+2)='A'; // <==== Access vioalation here
return 0;
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
修改C字符串常量?
使用malloc时char*str有什么区别?
int i;
char *s = (char*)malloc(sizeof(char)*27);
for(i=0;i<26;i++)
s[i]='a'+i;
s[26]='\0';
printf("%s\n",s);
reverse(s);
printf("%s\n",s);
Run Code Online (Sandbox Code Playgroud)
其中reverse()是
void reverse(char *str)
{
int i,j=strlen(str)-1;
char tmp;
for(i=0;i<j;i++,j--)
{
tmp=str[i];
str[i]=str[j];
str[j]=tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但使用时
char *t = "new string";
printf("%s\n",t);
reverse(t);
printf("%s\n",t);
Run Code Online (Sandbox Code Playgroud)
我得到一个段错误,调试器说它是反向的strlen.将char*t更改为char t []可以正常工作.是什么赋予了?