以下代码在第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测试.
我写的这段代码很简单
#include <stdio.h>
#include <string.h>
void printLastLetter(char **str)
{
printf("%c\n",*(*str + strlen(*str) - 1));
printf("%c\n",**(str + strlen(*str) - 1));
}
int main()
{
char *str = "1234556";
printLastLetter(&str);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想打印字符串中的最后一个字符,我知道printLastLetter的第一行是正确的代码行.我不完全理解的是*str和**str之间的区别.第一个是字符数组,第二个是?另外,char*str和str [10]之间的内存分配有什么不同?Thnks
我正在写一个非常简单的程序,从字符串中删除重复的字符.我运行了visual studio并得到了错误:
inteviews.exe中0x00d110d9处的未处理异常:0xC0000005:访问冲突写入位置0x00d27830.
我真的不明白这是什么问题.当前单元格获取下一个单元格的值.
void remove(char *str, char a) {
while (*str != '\0') {
if (*(str+1) == a) {
remove(str + 1, a);
}
*str = *(str +1 );//HERE I GET THE ERROR
++str;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char *str = "abcad";
while (*str != '\0') {
remove(str,*str);
str++;
}
std::cout << str << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我已经尝试将其更改为char str[] = "abcad"
但我仍然得到相同的错误.
可能重复:
获取分段错误
/* Reverse a string in place
*/
#import <stdio.h>
void reverse(char * str);
int main()
{
char * string = "This is a string.";
printf("%s\n", string);
reverse(string);
printf("%s\n", string);
}
void reverse(char * str)
{
char * start = str;
char * end = str;
if(0==*str)
return;
//Find the end
for(;0 != *(++end););
end--;
do
{
*end = *end ^ *start;
*start = *end ^ *start;
*end = *end ^ *start;
}while(++start < --end);
}
Run Code Online (Sandbox Code Playgroud)
我不确定为什么这个seg会出错.是因为我用常量字符串初始化我的char*?
可能重复:
获取分段错误
为什么此代码会导致分段错误?
char *text = "foo";
strcpy(text, "");
Run Code Online (Sandbox Code Playgroud)
据我所知,第一行分配一些内存(保存字符串"foo")并text
指向分配的内存.第二行将空字符串复制到text
指向的位置.
这段代码可能没有多大意义,但为什么它失败了?