[malloc与sizeof(data type)乘以数字而不乘以数字时,malloc的区别是什么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[malloc与sizeof(data type)乘以数字而不乘以数字时,malloc的区别是什么相关的知识,希望对你有一定的参考价值。

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

int main() {
    char *buffer = "hello";
    char *words = malloc(6 * sizeof(char));
    int count = 0;

    while (count < 10) {
        *(words+count) = buffer[count];
        count++;
    }

    printf("%s
", words);
    return 0;
}

我不知道将数字乘以sizeof(char)有什么区别。

例如,如果我删除6(只是char *words=malloc(sizeof(char));)该代码也有效。

我以为它在运行时不会起作用。

答案

[malloc(6 * sizeof(char))为6个字符的数组分配足够的内存。

如果不乘以6,则只能获得1个字符的足够内存。尝试访问*words以外的任何其他字符将导致未定义的行为。

count大于5时,您的代码会导致未定义的行为。它是在words的末尾写,在buffer的末尾读;这两个都是不确定的。

未定义的行为并不总是会产生错误消息,请参见Why don't I get a segmentation fault when I write beyond the end of an array?。因此您的代码似乎可以正常运行,但是仍然是错误的,将来可能会失败。

另一答案

在您的情况下,这没有太大意义,因为sizeof(char)始终为1

但是考虑如何计算存储类型为nmy_t结构所需的字节数。

typedef struct
{
    int a;
    double b;
    float x[10];
    void *y[30];
    float (*c[12])(int);
    /* more and more */
}my_t;


my_t *foo(size_t n)
{
    return malloc(n * sizeof(my_t));
}

如果不使用struct,很难猜测sizeof的大小。

以上是关于[malloc与sizeof(data type)乘以数字而不乘以数字时,malloc的区别是什么的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法基础之malloc()动态分配内存概述

Malloc调用崩溃,但在其他地方工作

t=(char*)malloc(n*sizeof(char))的含义?

使用 Malloc,sizeof(int) * numRows 和 sizeof(int * [numRows]) 之间的区别

如何将动态矩阵复制到 CUDA 中的设备内存?

sizeof运算符malloc函数及free函数