0

我想知道为什么下面的代码会崩溃?

我的环境是 ubuntu64,gcc 4.8.1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define SIZE 1024*1024*1024
int main()
{
    printf("%ld,%ld,%ld\n",sizeof(int),sizeof(long),sizeof(size_t));//output 4,8,8
    printf("%ld\n",SIZE); //output 1073741824

    int *p = (int*)malloc(SIZE);
    if(!p){
            perror("malloc");
            exit(1);
    }

    memset(p,0,SIZE);    //this works fine

    size_t i=0;   
    for(;i<SIZE;++i){
            p[i] = 10;  //gdb shows when crashed i = 268436476
    }    
}
4

2 回答 2

3

您正在分配SIZE bytes,而不是SIZE ints。当您尝试SIZE在循环中写入整数时,您for正在写入超出分配内存的末尾。

改变:

int *p = (int*)malloc(SIZE);

到:

int *p = malloc(SIZE * sizeof(p[0]));

另请注意int,我删除的演员表既多余又可能有害

于 2013-11-14T22:03:16.257 回答
1

采用

int *p = calloc(SIZE, sizeof p[0]);
于 2013-11-14T21:59:00.443 回答