#include <stdlib.h>
#include <stdio.h>
char* text1 = "This is a string.";
char* text2 = "Yet another thing.";
void copyCodes (int* list, char* text){
while(*text != 0){
*list = *text;
list++;
text++;
}
*(list+sizeof(int)) = 0;
}
int main(void){
int size = 72; //THIS IS THE ERROR
int* list1 = malloc(size);
int* list2 = malloc(size);
copyCodes(list1, text1);
copyCodes(list2, text2);
free(list1);
free(list2);
}
上記のコードはです。
しかし、size
を72から89の間の任意の値に変更した場合(72と89を除く)私はsysmalloc: Assertion ...
というエラーが発生します。C - "sysmalloc:アサーション..."エラーいくつかのサイズの場合
なぜですか?
注
エラーは、私のUbuntu(16.04)マシン上で発生するが、それは私のOSX(10.11.5)マシン上で正常に動作します。
フルエラー
malloc.c:2395: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)
注目に値するEDIT1
MIPSアセンブリで書かれており、各配列にメモリの80のバイトを割り当てる場合、コードが動作します。 (上のCコードはアセンブリ命令の正確な翻訳です)。
Iaの本*フル*コードを(私はそれがnullで終了する整数のリストが、null終端文字がすでにwhileループによってコピーされることだったと仮定し)、それを削除し、あなただけの
必要なバイトを必要とします? –
@ EugeneSh.Yeah。 (私はすべてを不要にしました)。 – Olian04
あなたはここにUBを持っています: '(list + sizeof(int))= 0;':オフセットは+4で、既に文字列を渡しています。実際には16を加算します。72 + 16 = 88は必要最小限です。 –