C 内联汇编程序不';无法正常工作,错误:双重自由或损坏(!prev)

C 内联汇编程序不';无法正常工作,错误:双重自由或损坏(!prev),c,assembly,C,Assembly,我有一个简单的问题。内联汇编程序工作不好。首先,忽略2d数组中的最后一行(我检查了它)。因此,我有一个错误“双重免费或损坏(!prev):0x087d7200***”。我使用AT&T语法。32位 #define SIZE2 500 创建数组 我根据模型计算了元素的地址 dane2(i*(amonut of rows) + j) * 4 释放内存。 intk; 对于(k=0;kYou在不通知编译器的情况下修改寄存器。您应该正确使用输出约束和clobbers。我希望这是某种学校作业,因为否则此内

我有一个简单的问题。内联汇编程序工作不好。首先,忽略2d数组中的最后一行(我检查了它)。因此,我有一个错误“双重免费或损坏(!prev):0x087d7200***”。我使用AT&T语法。32位

#define SIZE2 500
创建数组 我根据模型计算了元素的地址

dane2(i*(amonut of rows) + j) * 4
释放内存。
intk;

对于(k=0;kYou在不通知编译器的情况下修改寄存器。您应该正确使用输出约束和clobbers。我希望这是某种学校作业,因为否则此内联asm没有意义。不要强制转换malloc。
int**dane2=(int**)malloc(SIZE2*sizeof(int*);
应该是
int**dane2=malloc(SIZE2*sizeof*dane2);
dane2[i]=(int*)malloc(SIZE2*sizeof(int));
应该是
dane2[i]=malloc(SIZE2*sizeof**dane2);
读取-特别是关于被删除寄存器的部分。在
free
中,您可以使用
if(dane2[k])free(dane2[k])检查双重free);
这不是一个长期的解决方案,但它是一个快速测试,看看您在处理调用约定时是否有什么东西导致了对
dane2
中地址的更改,等等。。
    void dodaj2(int **dane2)
{
int size;
size = SIZE2;
int i,j;
for(i=0;i<SIZE2;++i)
{
    for(j=0;j<SIZE2;++j)
    {
    //  dane2[i][j] = dane2[i][j]*3 + dane2[i][j] + dane2[i][j]/2 +dane2[i][j]*4;
        asm volatile ( 
        "xor %%eax,%%eax \n\
        xor %%edx, %%edx \n\
        movl %%esi, %%eax \n\
        movl %%edi, %%esi \n\
        mull %%esi \n\
        addl %%ecx, %%eax \n\
        movl (%%ebx,%%eax,4), %%edi \n\
        #int3 \n\
        movl %%edi, %%edx \n\
        shl $3, %%edi \n\
        shr $1, %%edx \n\
        addl %%edx, %%edi \n\
        movl %%edi, (%%ebx, %%eax,4) \n\
        #int3"
        :
        :"S"(i), "c"(j), "b"(*dane2), "D"(size)
        );
    }
}

}
//dane2[i][j] = dane2[i][j]*3 + dane2[i][j] + dane2[i][j]/2 + dane2[i][j]*4;
dane2(i*(amonut of rows) + j) * 4
int k;
for(k=0;k<SIZE2;k++)
{
    free(dane2[k]);
}
free(dane2);