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

在C语言中导入链接器地址_end出现异常问题求助

问题分析与解决方法

问题原因

你用extern char _end;声明后直接打印_end,本质是读取该符号地址指向的内存内容,而非符号本身的地址值。

链接器脚本里的_end = .;是把当前链接地址赋值给_end符号,这个符号本身不占用内存空间,只是一个地址标记。当你将它声明为char类型变量并访问时,程序会去0x80000000(或后续实际地址)对应的内存位置读取一个char数据,而该位置恰好存储了值17,所以打印出的是这个内容而非地址。

正确导入方式

有两种可靠的方式获取_end的实际地址:

方式1:取符号的地址

保持extern char _end;的声明,通过取地址操作&_end获取符号的真实地址,再转换为整数类型打印:

#include <stdio.h>
#include <stdint.h>

extern char _end;

int main() {
    uintptr_t end_addr = (uintptr_t)&_end;
    printf("_end address: 0x%lx\n", end_addr);
    return 0;
}

方式2:声明为指针类型

直接将_end声明为指针,此时指针变量存储的就是符号的地址值:

#include <stdio.h>
#include <stdint.h>

extern char *_end;

int main() {
    uintptr_t end_addr = (uintptr_t)_end;
    printf("_end address: 0x%lx\n", end_addr);
    return 0;
}

注意:使用uintptr_t(来自<stdint.h>)存储地址是跨平台的规范做法,避免因指针宽度差异导致的问题。

内容的提问来源于stack exchange,提问作者Jip Helsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:10:57