c - 当我们尝试在 C 编程中将它用于多个字符串时,为什么 malloc 可以工作而 calloc 不能?

标签 c string pointers memory-management

在下面的代码中,我尝试使用双指针来访问多个字符串以及每个字符串中的每个字符。下面的代码按预期完美运行。但是我想知道为什么当我删除使用两次的 malloc 语句而只使用一个 calloc 语句作为

时它不起作用
ptr = (char **)calloc(2, sizeof(char)*20);

上面的 Calloc 语句做的事情与下面程序中的两个 malloc 语句做的一样。 Calloc 函数将简单地初始化两个数组,每个数组大小为 20Bytes。但我仍然不明白为什么这不起作用。

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

int main(){

int i=0;
char **ptr=NULL;

ptr =(char **) malloc(2*sizeof(char));
if(ptr==NULL){
    printf("Memory not allocated!\n");
    return -1;
}

for(i=0; i<2;i++){
    ptr[i] = (char *)malloc(20*sizeof(char));
    if(ptr[i]==NULL){
        printf("Memory not allocated!\n");
        return -1;
    }
}

for(i=0; i<2;i++)   
    scanf("%s", ptr[i]);

for(i=0; i<2; i++)  
    printf("%s\n", ptr[i]);

for(i=0; i<4; i++)
    printf("%c\n", ptr[0][i]);

for(i=0; i<4; i++)
    printf("%c\n", ptr[1][i]);

free(ptr[0]);
free(ptr[1]);
free(ptr);

return 0;
}

最佳答案

Calloc statement above does same thing which is done by two malloc statements in below program.

不,不会。抛开您的第一个 malloc() 甚至没有为一个指针分配足够的空间这一事实,更不用说两个,您似乎对数组和指针之间的区别感到困惑。

Calloc function will simply initialize two arrays of each size 20Bytes. But still I don't understand why this doesn't work.

这确实是描述 calloc() 调用(当它成功时)的效果的合理方式。更完整的描述可能是它为两个 20 个 char 数组的数组 分配空间并归零。但这与您在示例代码中对三个 malloc() 调用所做的事情不同

当您将 calloc() 的结果分配给类型不匹配的指针变量时,您就出错了。 char ** 是指向 char * 的指针。在某些情况下,指向的指针可能是此类指针数组的一个元素。但数组与指针完全不同,因此数组的数组与指针数组不同。

很可能你想要这个,而不是:

char (*ptr)[20] = calloc(2 * sizeof(char) * 20);

或者,更好的是:

char (*ptr)[20] = calloc(2 * sizeof(*ptr));

在任何一种情况下,ptr 都被声明为一个指向 20 个 char 数组的指针,并为指向的数组保留足够的空间作为第一个元素两个这样的数组。您可以按照您在问题中演示的所有方式使用结果指针,除了您必须 free() 只有一个指针 - 没有任何其他指针。

关于c - 当我们尝试在 C 编程中将它用于多个字符串时,为什么 malloc 可以工作而 calloc 不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50494783/

相关文章:

c - 设定长度的数组 C 的子集

c - 在 Mac 上用 C 创建二叉树时出现总线错误 10

c - 字符串长度错误

jQuery 滚动到文本或滚动到字符串

string - R从半标准字符串中提取时间分量

c++ - 我是否正确使用指针和数组?

c++ - 或 C++ : VS2010 multiplication operator being mistaken for a null pointer

c - 从文件中读取结构内的结构

javascript - 如何实现基于时间的一次性密码算法来实现Pebble?

c - Arduino 将十进制转换为二进制再转换为十进制