gpt4 book ai didi

c - 为什么打印完我的数组后控制台打印 "null pointer assignment"?

转载 作者:太空宇宙 更新时间:2023-11-03 23:31:38 24 4
gpt4 key购买 nike

我的任务是编写一个使用 c 的 malloc 的汇编例程,并从指向 asm 函数的指针向其插入值,数组打印它应该打印的内容,一切似乎都在程序打印的数字之后除外,它添加了“空指针赋值”

c文件:

#include <stdio.h>
#include <stdlib.h>

extern int initarr (int** arr, int n, int (*initfunc)());

int getNum()
{return (rand()%1000);}

void main()
{
int * arr, i, n, success;
printf("\nPlease enter the array size\n");
scanf("%d",&n);
success = initarr(&arr, n, getNum);
if(!success)
{
printf("Memory Allocation Failed\n");
return;
}
printf("\nThe Numbers in the allocated array are:\n");
for(i=0; i<n; i++)
printf("%d ", arr[i]);
}

汇编文件:

;lab10.asm
.MODEL SMALL
.CODE
.386
;extern int initarr (int** arr, int n, int (*initfunc)())
;arr=BP+4 n=BP+6 function=BP+8
EXTRN _malloc : NEAR
PUBLIC _initarr
_initarr PROC NEAR
PUSH BP;preserve BP
MOV BP,SP;let me see whats in the stack
PUSH SI;preserve SI
MOV SI,[BP+4];SI controls array
MOV CX,[BP+6];CX=n from declaration
MOV eAX,8;size of one byte=8
MUL CX;how many bytes to allocate
SUB eSP,eAX;size in bytes to allocate
PUSH eAX;preserve for later add to sp
PUSH eCX;for ussing malloc
CALL _malloc;return addres is in eAX
TEST eAX,eAX;checks if allocation succeded
POP eCX;pop CX for the loop
POP eAX;pop AX to add to SP
ADD eSP,eAX;for stack won't change
JZ BYE;if allocation went wrong and eAX is already 0
MOV [SI],eAX;sets SI to point at the array
MOV SI,[SI];set SI to the array
LOOPER:
PUSH CX;for ussing rand
CALL [BP+8];call function
POP CX;pop CX for the loop
MOV [SI],eAX
ADD SI,2
LOOP LOOPER
;end of loop
MOV eAX,1;for the return value
BYE:
POP SI;restore SI
POP BP;restore BP
RET
_initarr ENDP
END

enter image description here

__________________EDIT_____________________

对于每一个大于 5 的尺码,它的效果都很好 enter image description here

最佳答案

某些编译器在 MSDOS 平台上清理代码时显示“空指针分配”消息。清理代码检查 NULL ptr 周围的内存区域的内容是否已更改(因为在 MSDOS 中没有访问冲突这样的事情)。因此,您需要检查您的代码在哪里可以取消引用 NULL 或其他低偏移量。在下面的源代码中,我可以发现一个错误:

CALL _malloc;return addres is in eAX
TEST eAX,eAX;checks if allocation succeded
POP eCX;pop CX for the loop
POP eAX;pop AX to add to SP
ADD eSP,eAX;for stack won't change

_malloc 在 eAX 中返回 ptr,它在 2 个命令之后被 POP eAX(包含 8)覆盖。稍后您通过 MOV [SI],eAX 取消引用它,这是错误消息的根本原因。

关于c - 为什么打印完我的数组后控制台打印 "null pointer assignment"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14032574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com