对于c样式的字符串,如何将字符指针指向的内存地址赋予char?例如,在下面的示例中,我想将num更改为"123456",因此我尝试将p设置为'0'所在的数字,并尝试用'4'覆盖它.谢谢.
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* num = (char*)malloc(100);
char* p = num;
num = "123056";
p = p+3; //set pointer to where '4' should be
p = '4';
printf("%s\n", num );
return 0;
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
为什么简单的C代码会收到分段错误?
我在Ubuntu中使用GCC编译器和C语言; 我有这个程序:
void foo(char *word)
{
//something stupid
*word = 'z';
}
int main()
{
char word1[] = "shoe";
char *word2 = "shoe";
foo(word1);
printf("%s", word1);
foo(word2);
printf("%s", word2);
}
Run Code Online (Sandbox Code Playgroud)
那有什么区别?后者我得到一个segmentation fault错误.
可能重复:
为什么在写入字符串时会出现分段错误?
我的C代码遇到了一个奇怪的问题.我正在尝试使用strtok函数拆分字符串,但我得到访问冲突异常.这是我的代码:
char *token;
char *line = "LINE TO BE SEPARATED";
char *search = " ";
token = strtok(line, search); <-- this code causes crash
Run Code Online (Sandbox Code Playgroud)
但是,如果我char *line改为char line[],一切都按预期工作,我没有任何错误.
任何人都可以解释为什么我用strtok得到那个(对我来说很奇怪)的行为?我认为char*和char []是相同且确切的类型.
UPDATE
我正在使用MSVC 2012编译器.
可能重复:
为什么在写入字符串时会出现分段错误?
我有以下程序:
#include <iostream>
using namespace std;
void reverseString(char* first, char* last)
{
while(first < last)
{
cout << *first << " " << *last << endl; //for debugging; prints 'H' and 'o' then crashes
char temp = *last;
*last = *first; //this line crashes the program
*first = temp;
first++;
last--;
}
}
int main()
{
char* s = "Hello";
reverseString(s, s + strlen(s) - 1);
cout << s << endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法交换指针指向的值.我认为*p =*p1应该只是将p的指向值设置为p1的指向值,但似乎有些东西被搞砸了.在此先感谢您的帮助!
最近我有一个问题,我知道一个指向常量数组的指针(在下面的代码中初始化)位于该.rodata区域中,并且该区域仅可读。但是,我在模式C11中看到,此内存地址行为的写入将是不确定的。我知道Borland的Turbo-C编译器可以在指针指向的地方写,这是因为处理器在当时的某些系统上以实模式运行,例如MS-DOS?还是与处理器的操作模式无关?使用保护模式下的处理器,是否还有其他编译器可以写入指针并且不会导致任何内存破坏失败?
#include <stdio.h>
int main(void) {
char *st = "aaa";
*st = 'b';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在此代码与MS-DOS中的Turbo-C一起编译时,您将能够写入内存
可能重复:
为什么简单的C代码会收到分段错误?
嘿大家,我确定这是一个非常基本的问题,但显然我在这里并不是很了解.
在寒假期间,我一直在和C玩弄很多东西,只是遇到了一些我觉得可行的东西,却给了我一个分段错误.
如果我将字符串声明为:char name [5] ="Mike"; 我可以操纵字符串:*(name + 1)='a'; 这很好用,名字变成"Make".
如果我声明为:char*name ="Mike"; 然后尝试相同的事情:*(name + 1)='a'; 我遇到了分段错误.为什么我不能这样做?
如果我malloc空格的字符串:char*name =(char*)malloc(5*sizeof(char)); 然后将字符串复制到name:strcpy(name,"Mike"); 我可以像上面那样操纵它就好了.*(name + 1)='a'; 作品.
char*name ="Mike"'和char*name =(char*)malloc(5*sizeof(char))之间有什么区别; 的strcpy(姓名, "迈克");? 它们不只是指向包含字符串的内存吗?
抱歉,这是一个noobish问题!
此代码在运行时给出了分段错误.
char *str = "HELLO";
str[0] = str[2];
Run Code Online (Sandbox Code Playgroud)
请有人能告诉我为什么吗?
所以,它是一个非常简单的问题,我知道解决方案是一个简单的功能,如下所示:
void removeSpaces(char* s) {
char* source = s;
char* dest = s;
while(*source) {
if(*source == ' ') {
source++;
} else {
*dest++ = *source++;
}
}
*dest = 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Visual C++ 2008 Express版
当我用以下内容调用它时,它可以正常工作,没有任何问题,即它删除所有空格:
int main() {
char input[50] = "I like 2% milk";
removeSpaces(input);
cout<<input;
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,问题是当我通过将字符串声明更改为此来调用它时:
char * input = "I like 2% milk";
Run Code Online (Sandbox Code Playgroud)
我得到一个例外(某种访问违规)
removeSpace函数的这行代码显示异常
*dest++ = *source++;
Run Code Online (Sandbox Code Playgroud)
任何人都可以详细说明为什么会发生这种情况?
我试图使用两个指向相同字符串的指针就地反转一个字符串.第一个(char *p)指向字符串的起始位置,第二个(char *q)指向字符串的结束位置.因此,当我尝试使用gdb进行调试时,我在第16行遇到了分段错误.
当我试图打印的价值*p和*q,它工作正常.为什么我仍然能够访问这些位置时遇到段错误?
Breakpoint 1, main () at reverse.c:16
16 *q = *p;
(gdb) print p
$1 = 0x5555555547e4 "hello"
(gdb) print q
$2 = 0x5555555547e8 "o"
(gdb) step
Program received signal SIGSEGV, Segmentation fault.
0x00005555555546db in main () at reverse.c:16
16 *q = *p;
Run Code Online (Sandbox Code Playgroud)
该程序的实际代码是
#include<stdio.h>
int main() {
char *array = "hello";
char *p=&array[0];// pointer to the first element
// Make q point to last value of the array …Run Code Online (Sandbox Code Playgroud) 在阅读了faq和我能找到的其他所有内容后,我仍然感到困惑.如果我有一个以这种方式初始化的char指针:
char *s = "Hello world!"
字符串在只读内存中,我无法像这样更改它:
*s = 'W';
Run Code Online (Sandbox Code Playgroud)
制作"Wello世界!".我理解这一点,但对于我的生活,我不能理解如何使它不是只读的.我必须使用数组而不是指针吗?喜欢这里?
这是我的代码:
char *s = str;
char *e = s;
while (*e != '\0')
e++;
e--;
char *temp;
//Swop the string around
while (s <= e) {
*temp = *s;
*s = *e;
*e = *temp;
e--;
s++;
}
Run Code Online (Sandbox Code Playgroud)
错误消息只是一个分段错误.如果这是一个非常愚蠢的问题,请提前道歉.
非常感谢所有的帮助.在接受了你的所有建议后,我得到了这个:
void something(char * str) {
char *store = str;
char *s = new char[strlen(str) + 1]; //Allocate memory. Nice one.
strcpy(s, str);
char *e = new char[strlen(str) …Run Code Online (Sandbox Code Playgroud)