【发布时间】:2020-10-13 23:55:10
【问题描述】:
为什么是这个代码:
#include <stdio.h>
#include <stdlib.h>
int *mem;
*mem = 3;
int main(){
int *mem2 = malloc(4*4);
mem=mem2;
for(int i =0; i<4 ; i++)
mem[i]=i;
printf("%i\n",mem[2]);
}
正在发出警告:
a.c:5:1: warning: data definition has no type or storage class
*mem = 3;
^
a.c:5:2: warning: type defaults to ‘int’ in declaration of ‘mem’ [-Wimplicit-int]
*mem = 3;
^~~
a.c:5:8: warning: initialization of ‘int *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
*mem = 3;
-
mem 没有类型或存储,但它应该是 (int*) 类型
-
type 默认为 int,但 mem 已经有 type
为什么问题出在 main 之外?我没有函数或逻辑,只有 simple 赋值,那为什么会出现问题?组装完成后,mem 驻留在文本段中,而不是数据段(奇怪),否则它通常通过 rip-relative 模式访问(例如 mov %rax, mem(%rip)),所以这里没有问题。
.text
.globl mem
.data
.align 8
.type mem, @object
.size mem, 8
mem:
.quad 3
.section .rodata
.LC0:
.string "%i\n"
.text
.globl main
.type main, @function
main:
...
【问题讨论】:
-
您不能将
*mem = 3;排除在函数之外。请注意,即使您在没有将 mem 初始化为有效地址的函数中也有此功能,您也无法执行*mem = 3;否则行为未定义。还做malloc(4*4);你假设int的大小是4,最好做malloc(4*sizeof(int));或malloc(4*sizeof(*mem2));让编译器以安全的方式完成这项工作 -
这不是汇编语言的问题,问题是 C 语言的设计以及函数之外的代码是如何解析的/编译器如何试图理解它。我修复了问题上的标签以反映错误消息的真正原因。另外,不,
mem不会出现在文本段中,这不合理,因为它不是const。 -
@PeterCordes 您可以查看编辑。在.text 或.rodata 中(mem 在.text 范围内,但在内部定义为
.section .rodata),但不一定在数据段中 -
如果它不在 main 中,并且没有被 main 调用,您希望该分配何时运行?
-
@stark 正如上面的评论,我不太确定。定义“下”
.text段,但在标签定义中,有.section .rodate。我不知道一个段/节的范围有多长,所以我不知道它属于什么
标签: c memory malloc language-design