You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么C语言函数传参后可修改arr[0]却无法修改ptr[0]?

#include <stdio.h>

void dosmth(char* ptr, char* arr);

int main() {
    char* ptr = "hello";
    char arr[] = "jumbo";

    dosmth(ptr, arr);
    return 0;
}

void dosmth(char* ptr, char* arr) {
    arr[0] = 'J';
    ptr[0] = 'H'; //注释该行代码程序可正常运行
    printf("%s\n", arr);
    printf("%s\n", ptr);
}

问题解答

指针能否修改指向的内容,和指针本身的来源无关,只和它指向的内存区域的读写权限有关,二者的差异本质是指向的内存段权限不同:

  • char* ptr = "hello" 中,ptr指向的是存放在只读数据段的字符串字面量,该区域权限为只读,不管这个指针被传递到哪个函数、做过什么类型转换,只要尝试写入该地址都会触发非法内存访问错误。
  • char arr[] = "jumbo" 中,arr对应的是栈上开辟的可读写内存空间,代码会把字符串字面量"jumbo"的内容拷贝到这块栈内存中。当数组作为参数传入函数衰变为指针后,这个指针仍然指向原来的可读写栈内存,所以通过该指针修改内容是合法操作。

内容的提问来源于stack exchange,提问作者D-I-S-C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:15:05