Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么控制台上会打印“;空指针赋值“;在我的数组被打印之后?_C_Assembly_Malloc - Fatal编程技术网

C 为什么控制台上会打印“;空指针赋值“;在我的数组被打印之后?

C 为什么控制台上会打印“;空指针赋值“;在我的数组被打印之后?,c,assembly,malloc,C,Assembly,Malloc,我的任务是编写一个使用c的malloc的汇编例程,并将值从指针插入asm中的函数,数组打印出它应该打印的内容,所有内容看起来都是正确的除了程序打印的数字之外,它还添加了“空指针赋值” c文件: #include <stdio.h> #include <stdlib.h> extern int initarr (int** arr, int n, int (*initfunc)()); int getNum() {return (rand()%1000);} vo

我的任务是编写一个使用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]);
} 

编辑编辑

对于每一个大于5的尺寸,它的工作都很好

一些编译器在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,该ptr在2个命令之后被POP-eAX覆盖(包含8个命令)。随后,通过
MOV[SI],eAX取消对它的引用,这是错误消息的根本原因。

您需要检查initarr中n的值(&arr,n,getNum);
success=initarr(&arr,n,getNum)中的大小
应乘以单个元素的大小:
success=initarr(&arr,n*sizeof*arr,getNum)第二个想法:也许这就是
MUL-CX用于?这是16位还是32位代码?我相信在16位模式下使用32位寄存器可能会有副作用。由于您正在调用malloc(可能会失败),然后检查EAX(32位寄存器),这可能是它工作不正常的部分原因?“一个字节的大小=8”,你肯定是指1?更多:
SUB-eSP,eAX;要分配的大小(字节)
——我想应该是alloca(),然后不使用它,只恢复堆栈指针<代码>添加eSP、eAX;因为堆栈不会改变
JZ-BYE;如果分配出错且eAX已为0
-您知道如果使用“添加”,Z标志会改变吗?这到处都是错误的。尝试从头重写代码。我是认真的![是的,您可能可以一次更改一点来完成它,但这需要更长的时间!]16是16字节-2将是2字节。处理器以字节为单位计数(一般来说,有些以字为单位,但实际上并不多,而且据我所知,没有一个以位为单位计数!)
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