当我使用calloc()函数动态分配5个元素的空间时,为什么我可以给予6个元素?

qnzebej0  于 2022-12-11  发布在  其他
关注(0)|答案(2)|浏览(90)

第一个
它应该只分配5个元素的空间,对吗?我不明白为什么它分配6个整数。

new9mtju

new9mtju1#

你去一家商店,买了六块糖,告诉收银员你有五块糖,付了五块钱,然后离开。
这个故事是不是暗示人们可以拿六块糖,而只付五块的钱?不,不是。
没有人能保证每一个入店行窃的人都会被抓住。这种没有保证的情况并不构成对入店行窃的认可,也不是保证没有入店行窃的人会被抓住。
当你违反C语言规则时,语言并不总是保证你会被抓住。这种没有保证的情况并不是对违反规则的认可,也不是对你永远不会被抓住的承诺。
你的第六个数组元素是商店里偷来的糖果。你 * 这次 * 没有被抓住。这并不意味着你下次不会被抓住,或者在你最不希望的时候。
Live demo
对于这种缺乏保证的情况,有一个技术术语(或者C语言的行话)叫做undefined behavior,任何C程序员都必须熟悉它。

blmhpbnm

blmhpbnm2#

for循环的范围是0-5,这意味着你要访问6个地址(0,1,2,3,4,5),但你只动态分配了5个。因此,将循环的范围从0-5改为0-4就可以了。另外,你必须在程序结束时释放动态分配的内存。

#include <stdio.h>
#include <stdlib.h>
int main(){
    int *ptr;
    ptr=(int*)calloc(4,sizeof(int));
    for(int i=0;i<5;i++){
        printf("Enter the %d value:",i+1);
        scanf("%d",&ptr[i]);
    }
    printf("\n Elements in allocated memory\n\n");
    for(int i=0;i<5;i++){
        printf("The %d element is: %d\n",i+1,ptr[i]);

    }
    free(ptr);

    return 0;
}

输出:

Enter the 1 value:1
Enter the 2 value:2
Enter the 3 value:3
Enter the 4 value:4
Enter the 5 value:5

Elements in allocated memory

The 1 element is: 1
The 2 element is: 2
The 3 element is: 3
The 4 element is: 4
The 5 element is: 5

Process returned 0 (0x0)   execution time : 5.662 s

相关问题