-LemonP- 2018-12-08 06:50 采纳率: 100%
浏览 8109
已采纳

C语言关于出现错误代码C2040 间接寻址级别不同的问题

这里是小白,在研究数组与指针时发现了问题。
在主函数外进行如下声明后程序正常运行:

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

char str[30] = "Hello world";
char *ptr = str;

void main()
{}

而修改成如下却报错:

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

char str[30] = "Hello world";
char *ptr;
ptr = str;

void main()
{}

显示

C2040 “ptr”:“int”与“char *”的间接寻址级别不同

C4047 “初始化”:“int”与“char *”的间接级别不同

定义为int型仍然报类似的错 在VS2017与VC6环境情况相同

将两者放入主函数则都没有问题

新人懂得不多 希望各位能够详细解答 多谢了

  • 写回答

4条回答 默认 最新

  • 无形有道 2019-09-13 19:22
    关注

    这是一个关于在全局区赋值的经典问题

    首先,C/C++语言规定,不允许在函数外部有赋值语句,并且允许初始化语句。
    第二,这是因为在全局区的赋值语句执行顺序是没有保证的,如果强行编译,则可能因编译加载的文件顺序不同而结果不同。
    第三,C/C++语言以及编译器规定,不允许用户在全局区修改静态数据内存空间,因此在全局区的赋值语句是不符合语言规范的。
    

    在C/C++编译的程序占用的内存中,全局变量存储于全局区(static)也叫静态数据内存空间。
    其中,初始化的全局变量和静态变量放一块区域,没有初始化的在相邻的另一块区域。

    
    // 声明一个变量,同时分配内存并赋值
    char *ptr = str;
    
    // 声明一个变量但不分配内存
    char *ptr;
    
    // ptr=str表示分配内存并赋值(在全局区不允许)
    ptr=str;
    
    

    最后,再附一张C/C++的栈空间和堆空间示意图
    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件
  • ¥15 visual studio2022中文乱码无法解决