将一个数字乘以sizeof(数据类型)和不乘以一个数字时,malloc的区别是什么

将一个数字乘以sizeof(数据类型)和不乘以一个数字时,malloc的区别是什么,c,malloc,C,Malloc,我想知道把一个数字乘以sizeofchar有什么区别 例如,如果我删除6个just char*words=mallocsizeofchar; 代码也可以工作 我假设它不会工作,但是当我运行它时它会工作。malloc6*sizeofchar为6个字符的数组分配足够的内存 如果你不乘以6,你只能得到足够的内存来存储1个字符。尝试访问除*字以外的任何字符将导致未定义的行为 每当计数大于5时,您的代码就会导致未定义的行为。它是写在字尾之外,读在缓冲区之外;这两个都是未定义的 未定义的行为并不总是产生错误

我想知道把一个数字乘以sizeofchar有什么区别

例如,如果我删除6个just char*words=mallocsizeofchar; 代码也可以工作

我假设它不会工作,但是当我运行它时它会工作。

malloc6*sizeofchar为6个字符的数组分配足够的内存

如果你不乘以6,你只能得到足够的内存来存储1个字符。尝试访问除*字以外的任何字符将导致未定义的行为

每当计数大于5时,您的代码就会导致未定义的行为。它是写在字尾之外,读在缓冲区之外;这两个都是未定义的

未定义的行为并不总是产生错误消息,请参阅。因此,您的代码看起来似乎正常工作,但仍然是错误的,将来可能会失败。

malloc6*sizeofchar为6个字符的数组分配足够的内存

如果你不乘以6,你只能得到足够的内存来存储1个字符。尝试访问除*字以外的任何字符将导致未定义的行为

每当计数大于5时,您的代码就会导致未定义的行为。它是写在字尾之外,读在缓冲区之外;这两个都是未定义的


未定义的行为并不总是产生错误消息,请参阅。因此,您的代码看起来似乎正常工作,但它仍然是错误的,将来可能会失败。

在您的情况下,它没有太多意义,因为sizeofchar始终为1

但是考虑如何计算存储MyTy.< /P>类型的N个结构所需的字节数。


如果不使用sizeof,就很难猜测结构的大小。

在您的情况下,这没有太大意义,因为sizeofchar总是1

但是考虑如何计算存储MyTy.< /P>类型的N个结构所需的字节数。



如果不使用sizeof,就很难猜测结构的大小。

在哪里找到常数10?还是6号?常量不属于程序,如果可以派生的话。6*sizeofchar在内存中保留6个字符/6个字节。您可以超过限制,但这并不安全,因为这些地址可能正在使用中或可以在任何时候分配…@wildplasser我想这是随机的,表明没有限制。当您使用malloc时,它通常会将您请求的大小舍入到方便的更大大小的倍数,例如8个字节甚至16个字节的倍数。这部分保护了你。但是,您的代码通过在分配的空间之外写入以及在数组缓冲区边界之外读取来显示未定义的行为。任何事情都有可能发生,包括代码看起来工作正常,但不正常。@Cedced_Bro在数组末尾访问内存不仅不安全,也不随机。这是未定义的行为,意味着整个程序不必产生合理的结果。代码基本上被破坏了。你在哪里找到常数10的?还是6号?常量不属于程序,如果可以派生的话。6*sizeofchar在内存中保留6个字符/6个字节。您可以超过限制,但这并不安全,因为这些地址可能正在使用中或可以在任何时候分配…@wildplasser我想这是随机的,表明没有限制。当您使用malloc时,它通常会将您请求的大小舍入到方便的更大大小的倍数,例如8个字节甚至16个字节的倍数。这部分保护了你。但是,您的代码通过在分配的空间之外写入以及在数组缓冲区边界之外读取来显示未定义的行为。任何事情都有可能发生,包括代码看起来工作正常,但不正常。@Cedced_Bro在数组末尾访问内存不仅不安全,也不随机。这是未定义的行为,意味着整个程序不必产生合理的结果。代码从根本上说是错误的。行为是未定义的,因为代码读取超出了对象的边界。这不是我说的吗?不。你的回答没有提到任何关于读取超出对象边界的内容。我说的是访问,这意味着读和写。无论如何,我添加了更多的细节。行为是未定义的,因为代码读取超出了对象的边界。这不是我说的吗?不。你的回答没有提到任何关于读取超出对象边界的内容。我说的是访问,这意味着读和写。不管怎样,我添加了更多的细节。从最初的问题可以清楚地看出,也许只有当你读到OP要求去掉6,而不是sizeof,所以这个答案虽然本身没有说明错误,但并没有以有意义的方式回答问题。@EOF what Falshood>\No Falshood,@P_uuj_uu-但它也没有真正回答这个问题。从最初的问题可以清楚地看出,也许只有当你阅读它时,OP才是在询问关于取消
6,不是这个问题的大小,所以这个答案虽然没有说明错误本身并没有以一种有意义的方式回答这个问题。@EOF what falshood>\No falshood,@P_uj_u-但它也不是真正回答这个问题。
#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\n", words);
    return 0;
}

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));
}