C 内联汇编程序不';无法正常工作,错误:双重自由或损坏(!prev)
我有一个简单的问题。内联汇编程序工作不好。首先,忽略2d数组中的最后一行(我检查了它)。因此,我有一个错误“双重免费或损坏(!prev):0x087d7200***”。我使用AT&T语法。32位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。我希望这是某种学校作业,因为否则此内
#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);