首页 > 其他分享 >extern int[] VS extern int*

extern int[] VS extern int*

时间:2024-10-16 19:46:56浏览次数:8  
标签:int test 地址 VS extern array main

2024.10.16 遇到了一个 extern Type* 出现崩溃,但 extern Type[] 正常的问题。

声明:本文所有内容都基于 64 位系统和程序而言,32 位原理一致,但数值上会有差异。

现象

通过查阅资料发现 Extern pointer to variable vs array 早就提过这个问题。

// func.c 
#include <stdio.h>

int array[10] = { 10, 2, 3 };

int test()
{
    printf("in test: array address = %p\n", array);
    return 0;
}
// main.c
#include <stdio.h>

extern int* array;
//extern int array[]; // 改为数组就符合预期了
int test();

int main(int argc, char* argv[])
{
    printf("in main: array address = %p\n", array);
    test();
    return 0;
}

将上面两份 c 代码分别保存为 func.cmain.c,在 VS 中运行如下:

运行截图

通过最终输出,发现 main.c 中 array 把它的内容(9 和 2 拼成长度为 8 的内容)打印出来了。

根因

正如 comp.lang.c FAQ list · Question 6.2 中所述

数组和指针

就此例而言,数组的地址上的内容就是 9, 而对于指针而言 int *p = array 时,p 的地址本身是不清楚的,只是说 p 的值是 array 的地址。

因此我们在 extern int* arary 的时候 main.carray 编译器认为它是一个指针,而它的地址又跟 func.c 中的 array 一样,因此此时编译器就认为这个指针指向的地址为 array 前几个元素的内容(凑到 8 字节即可)。

标签:int,test,地址,VS,extern,array,main
From: https://www.cnblogs.com/cuzperf/p/18470622/extern

相关文章

  • 【CTF-SHOW】Web入门 Web27-身份证日期爆破 【关于bp intruder使用--详记录】
    1.点进去是一个登录系统,有录取名单和学籍信息发现通过姓名和身份证号可以进行录取查询,推测录取查询可能得到学生对应学号和密码,但是身份证号中的出生日期部分未知,所以可以进行爆破2.打开bp抓包这里注意抓的是学院录取查询系统发送POST类型进行查询的包,第一遍抓不到很正......
  • java 查看jvm使用哪个垃圾回收器 -XX:+PrintCommandLineFlags
    java查看jvm使用哪个垃圾回收器在Java中,你可以通过查看JVM启动参数来确定使用的垃圾收集器。你可以使用java命令的-XX:+PrintCommandLineFlags参数来打印出JVM的启动配置,包括选择的垃圾收集器。例如,你可以通过以下命令运行Java应用程序来查看使用的垃圾收集器:java-XX:+PrintC......
  • k8s和ipvs、lvs、ipvsadm,iptables,底层梳理,具体是如何实现的
    计算节点的功能:提供容器运行的环境kube-proxy的主要功能:术业有专攻,kube-proxy的主要功能可以概括为4个字网络规则那么kube-proxy自己其实是个daemonset控制器跑的每个节点上都有个的pod它负责网络规则其实呢它还是个小领导它不直接去搞网络规则而是告诉别人,网络规......
  • 【Java后端】Spring vs SpringBoot
    在Java开发领域,Spring框架凭借其强大的功能和丰富的生态系统,一直是构建企业级应用的利器。然而,传统的Spring项目配置繁琐,启动缓慢,常常让开发者陷入XML配置和依赖管理的泥潭,极大地影响了开发效率。SpringBoot应运而生,它秉承“约定大于配置”的理念,通过自动配置、起步......
  • Python vs Java:爬虫任务中的效率比较
    爬虫技术作为一种自动化的数据采集手段,广泛应用于数据挖掘、信息聚合、内容监控等多个领域。Python和Java是两种流行的编程语言,它们都可以用来开发高效的爬虫程序。本文将探讨Python和Java在爬虫任务中的效率,并展示如何在代码中设置代理信息以提高爬虫的可用性和安全性。......
  • python批处理,一键打开vscode窗口,分别加载jeecg前后端项目,并运行前后端服务.
    importsubprocess#VsCode打开后端项目cmd1=["code","D:\pro\JeecgBoot-v3.7.1\jeecg-boot"]process1=subprocess.Popen(cmd1,stdout=subprocess.PIPE,shell=True)output1,_=process1.communicate()print(output1.decode('utf-8')......
  • Linux环境搭建vsftpd服务
    vsftpd(verysecureFTPdaemon)是一个广泛使用的、开源的FTP服务器软件,以其高性能、高安全性和稳定性著称,支持多种FTP相关协议,包括FTP、SFTP(通过SSH)、TLS/SSL加密的FTP等。一:安装vsftpd#安装vsftpd服务yuminstallvsftpd-y#启动FTP服务,并设置开机自启动systemctlenablev......
  • 模板-自动取模整型mint
    输入为int64类型,底层用int64表示,每次运算后自动取模。template<intMOD>structMInt{i64x;intnorm(i64u)const{u%=MOD;if(u<0)u+=MOD;returnu;}MInt(i64v=0):x(norm(v)){}intval()const{returnx;}MIntoperator-()const{returnMInt......
  • Vmware挂载san存储_vSphere 6.x 共享存储LUN丢失分区表修复(精华)
    Vmware挂载san存储_vSphere6.x共享存储LUN丢失分区表修复(精华)炎炎夏夜客户机房空调意外故障,前端ESXI物理服务器由于温度过高都自保关机,存储和SAN没有自保关机。上班修复空调后,检查存储,检查SAN无异常。开始开机ESXI主机,开机完后发现存储映射的两个LUN全部消失,重启存储,重启ESX......
  • DevEco Studio:代码code Linter检查
    CodeLinter代码检查CodeLinter针对ArkTS/TS代码进行最佳实践/编程规范方面的检查。检查规则支持配置,配置方式请参考配置代码检查规则。开发者可根据扫描结果中告警提示手工修复代码缺陷,或者执行一键式自动修复,在代码开发阶段,确保代码质量。检查方法:在已打开的代码编辑器窗......