gpt4 book ai didi

c - 为什么指针声明指向未知内存而定义不是?

转载 作者:太空宇宙 更新时间:2023-11-04 06:19:24 25 4
gpt4 key购买 nike

我知道以下代码返回段错误,因为它试图写入 q 指向的内存部分(某个随机地址),而给定进程不允许写入这部分内存:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
char* p = "Hello";
char* q;

strcpy(q, p);
printf("%s\n", q);
}

我还了解到,可以通过动态分配适当的内存量并将 q 指向该内存来轻松修复它,因此可以将 p 内容安全地复制到 q:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
char* p = "Hello";
char* q = (char*)malloc(6*sizeof(char));

strcpy(q, p);
printf("%s\n", q);
}

但为什么以下示例有效?

#include <stdio.h>

int main(){
char* p = "Hello";
printf("%s\n", p);
}

是不是 char* p = "Hello"; 也指向一些不允许给定进程写入的未知内存?

最佳答案

代码

char* p = "Hello";

创建一个包含六个字符的数组并将它们设置为 "Hello"(第六个字符是空字符)。然后,它将这个数组的内存地址写入p。所以p指向一个初始化的内存段。

关于您的第二个示例:p 包含字符数组"Hello" 的内存地址。如果你想让q包含相同的内存地址,你必须使用命令

q = p;

在代码中

q = &p;

类型不兼容,因为q 的类型是char*,而&p 的类型是char** .

关于c - 为什么指针声明指向未知内存而定义不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38484891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com