2015-10-29 33 views
0

这是几个小时了,我真的很沮丧,为什么会发生这种事情,所以我问是否有任何好的灵魂可以解释这一点给我。两个不同的输出使用malloc

int main() 
{ 
    FILE* filePointer; 
    int* tempPointer1; 
    int* tempPointer2; 

    filePointer = fopen("numbers.txt","r"); 

    tempPointer1 = (int*) malloc(sizeof(int)*10); 
    tempPointer2 = tempPointer1; 

    int j; 
    for(j=0;j<10;j++) 
    { 
     fscanf(filePointer,"%d ",tempPointer1); 
     printf("%d ", *tempPointer1); 
     tempPointer1+=sizeof(int); 
    } 

    printf("\n"); 

    int i; 
    for(i=0;i<10;i++) 
    { 
     printf("%d ", *tempPointer2); 
     tempPointer2+=sizeof(int); 
    } 

    fclose(filePointer); 
    return 0; 
} 

这是即时得到输出:

1 2 3 4 5 6 7 8 9 10 

1 2 3 12337 5 6 7 8 9 10 

任何人都可以解释,为什么?

P.S如果我使用静态int数组输出是相同的。

+0

[不投射的malloc的结果](http://stackoverflow.com/a/605858/1413133) –

回答

4

指针算术的设计使得增量具有类型指针的大小。所以在这个部分

tempPointer1+=sizeof(int); 

你是太大的一步递增,超越了数组的边界和调用未定义的行为。您需要通过1递增,即

tempPointer += 1; 

,或者更简洁,

++tempPointer1; 

注意:你不应该在C.投malloc结果您可以将其分配给非空指针直接:

tempPointer1 = malloc(sizeof(int)*10); 
+0

啊,感谢FO答案是,但是,如果我试图写入我没有分配的内存,那么在这种情况下我不会得到分段错误吗? –

+0

@SirDrinksCoffeeALot你得到未定义的行为。有时候这可能会导致分段错误,但不一定。 – juanchopanza

+0

@SirDrinksCoffee ALot段错误只发生在您访问您无权访问的细分受众群时。段通常是1KB或甚至64KB或更大(取决于底层操作系统如何使用MMU)的范围内存块,因此在离开有效段之前可以覆盖相当远的距离。几乎总是将0附近的块标记为无权访问(所以NULL解除引用会导致错误),但除此之外,操作系统会将其标记为不可访问或不可访问。 (IOW,不要依靠段错误来找到你的错误) –

相关问题