我试图理解指针,这是我正在尝试实施的K&R程序.该程序是strcpy与KR的代码.
/*strcpy: copy t to s; pointer version 3*/
void strcpy(char *s, char *t){
while(*s++ = *t++)
;
}
Run Code Online (Sandbox Code Playgroud)
所以为了实现这个程序,我补充道
#include<stdio.h>
int main(){
char *s="abc", *t="ABC" ;
strcpy(s,t);
printf("%s\n",t);
printf("%s\n", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,我收到分段错误.我确信我错过了一些东西,但不太确定是什么.
谢谢!
我写了这段代码,因为我在写一个更大的程序时遇到了类似的问题.尽管如此,我知道问题是一样的,所以我做了一个小例子.
#include <stdio.h>
typedef struct
{
int x;
char * val;
}my_struct;
int main()
{
my_struct me = {4, " "};
puts("Initialization works.");
me.val[0] = 'a';
puts("Assignment works.");
puts(me.val);
puts("Output works.");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当使用tcc(Tiny C Compiler)编译时,它编译并执行正常.但是,使用GCC 4.6.0 20110513(预发行版)它会编译,但是,当我执行它时,我只能通过"初始化工作".在获得段错误之前.
我究竟做错了什么?是我的代码还是我的GCC编译器?
可能重复:
为什么在写入字符串时会出现分段错误?
我希望这个程序的输出是:ibjgsjfoet但是我得到了一个分段错误.
#include <stdio.h>
int main()
{
char *p="haifriends",*p1;
p1=p;
while(*p!='\0')
++*p++;
printf("%s %s",p,p1);
return 0;
}
Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
#include <conio.h>
void test(char *p)
{
p = p + 1;
*p = 'a';
}
int main()
{
char *str = "Hello";
test(str);
printf("%s", str);
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,它会给出分段错误?为什么会发生这种情况.const理论对我来说并不清楚......如果我将str声明为char str [],那么它就完成了工作.它们不是基本相同的东西吗?
char * abc = "ABC";
int i;
printf("%s\n", abc);
for (i = 0; i < strlen(abc); i++)
{
abc[i] = tolower((int) abc[i]); //Error at this line
}
printf("%s\n", abc);
Run Code Online (Sandbox Code Playgroud)
我称之为tolower的行不执行?
考虑一下这段片段:
char *str = "hellow Ghost";
str[0] = 'z';
printf("%s", str);
Run Code Online (Sandbox Code Playgroud)
这是一个分段错误.它是否也在运行时内存错误?
我通过分段故障理解的是:当您访问不属于您的内存时,分段错误.它基本上是为您创建的实用程序,可以在不让您破坏内存的情况下轻松完成工作.
分段错误涵盖了多少和什么样的内存错误以及调用它来检查指针或引用处理内存的错误.
由于逻辑不正确,也会发生运行时错误.除此之外,运行时错误和关于内存的分段错误之间是否存在任何差异.
我是C新手,我想执行此任务:声明并初始化一个字符串,然后将每个字符串元素重新分配给一个新值.
以这种方式编写代码:
char *str = "geeksforgeeks\0";
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
抛出分段错误.
但是如果我以这种方式编写代码:
char string[] = "geeksforgeeks\0";
char *str = string;
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
程序行为正确.
还有这段代码:
char str[] = "geeksforgeeks\0";
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
行为正确.
两者有什么区别?不应该相同吗?
我正在使用strchr在缓冲区中找到=遇到的点.然后我正在改变那个相同的角色而不是a M.我在尝试执行此操作的行中遇到了段错误.
这是完整的代码:
int main(void){
char *buffer = "Name=Tom"
char *pointer;
pointer = strchr(buffer,'=');
*pointer = 'M'; <--------- Segfault Occurs here
return (0);
}
Run Code Online (Sandbox Code Playgroud)
我在segfault中遇到以下错误:
Process terminating with default action of signal 11 (SIGSEGV)
Bad permissions for mapperd region at addresss .....
Run Code Online (Sandbox Code Playgroud) 我是从一本书中自学C,目前正在学习指针和数组.
#include <stdio.h>
#include <string.h>
#define LINES 5
void main()
{
char* str[LINES];
str[0] = "hola";
str[1] = "mundo";
*(*(str + 0) + 1) = 'Z';
printf("%c", *(*(str + 0) + 1));
}
Run Code Online (Sandbox Code Playgroud)
在这里,我想用"Z"替换"hola"的'o',但它不起作用.如果我删除: ((str + 0)+ 1)='Z'; 我在输出中得到'o'但是如何替换字符串的字符?
我正在学习 C++ 以更好地理解内存。
char *name = "example";
*(&name+1) = (char*)'A';
std::cout << name << std::endl;
Run Code Online (Sandbox Code Playgroud)
返回示例而不是eAample。
我的想法是获取“x”的内存地址并更改它。
不是 const 所以我应该能够改变地址的值对吗?
obs:我知道用其他方法怎么做,我很好奇用这种方法。