【问题标题】:No segmentation fault without malloc没有 malloc 没有分段错误
【发布时间】:2013-12-22 10:46:01
【问题描述】:

有一个表应该按照确定的函数增长。每次表满时,都会调用函数addMemory,将当前表->表大小加倍。一切似乎都正常,但是,为了测试程序,我评论了 addMemory 调用,所以我期待一个分段错误,因为操作系统没有请求新内存,但它没有失败,实际上是在 malloc 的内存空间旁边写入数据,没有任何错误。 我想知道为什么会这样??

代码在这里:

 int main(){
    //user* newUser = (user*)malloc(BASE_SIZE*sizeof(user));
    user* newUser = (user*)malloc(sizeof(user));

    userTable* table = (userTable*)malloc(sizeof(userTable));
    newUser->age = 1000;
    table->length = 0;
    table->table= newUser;
    table->length++;

    int i = 0;
    int memlimit = 1000;
    for(i = 1; i < memlimit; i++){
        if(memZone(table->length-1) != memZone(table->length)){
//this is the line that asks for more memory 
            addMemory((void*)table,"userTable");
            printf("mem pos =%i, age = %i\n",table->length,table->table[i-1].age);
        }
        table->table[i].age = (1000 + i);
        table->length++;

    }

    printf("All memory have been successfully allocated \n");
    int anything;
    while(scanf("%i",&anything)){
        reduceMemory((void*)table,"userTable");
        printf("Age = %i \n",table->table[table->length - 1].age);

    }
}

结构定义如下:

typedef struct {
    /* Username unique for this user in the system */
    char username[25];

    /* User name */
    char name[100];

    /* Age */
    unsigned int age;

    /* User city */
    char city[128];

} user;

/* Table of users */
typedef struct {
    /* Array of users */
    user* table;
    /* Number of registers in the table */
    int length;
} userTable;

【问题讨论】:

    标签: c segmentation-fault malloc


    【解决方案1】:

    在现代 C 库中,malloc 通常只是从内核分配的更大的块中分配内存。它不会每次都去内核请求更多的内存,那将是低效的。

    所以 CPU 和操作系统内核可能不知道有什么问题,但这是具有未定义行为的无效代码,所以不要这样做。特别是,对 malloc 的下一次调用可能会重新分配您已经用于其他用途的内存。

    【讨论】:

    • 这就是我正在寻找的答案,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2014-03-29
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多