当使用malloc()分配相同大小的内存时,int *和char *之间有什么区别

时间:2016-10-07 22:06:43

标签: c pointers

int* pInt = malloc(512);
char* pChar = malloc(512);

我很难掌握这个概念。指针类型具有相同的大小,4或8字节,具体取决于系统。 int有4个字节,char有1个字节。在这里,我为int和char类型的每个指针分配512个字节。那些指针应该具有相同的大小(内存块)。我知道它们指向不同的内存块,它们都有512个字节。但它们有何不同?

4 个答案:

答案 0 :(得分:4)

它们都指向512字节的内存块。实际上只有两个不同之处:

1)取消引用它们时,pInt将存储并加载整数值,而pChar将存储和加载字符值。

2)pInt[1]将引用内存块pInt指向的第二个整数大小的块。 pChar[1]将引用内存块pChar指向的第二个字符大小的块。

所以:

*pInt = 0;将块pInt指向的第一个整数大小的内存块设置为整数值零。

*pChar = 0;设置块pChar中第一个字符大小的内存块指向的字符值为零。

答案 1 :(得分:3)

你是对的。 pIntpChar非常相似。 (如果你查看发出的机器代码,它们可能是相同的 - 到目前为止。)

当你使用指针时会出现差异。当你说

*pChar = 0;

你会将pChar指向的1个字节设置为0.但是当你说

*pInt = 0;

你将整个int的内存值设置为0。

答案 2 :(得分:1)

两个语句都是赋值表达式。赋值有两个方面:左边一个,表示赋值给谁,右边一个,表示要赋值的值。

在您的示例中,右侧保留记忆:malloc(512)。这样做,没有说关于该块的使用,尤其是。关于存储什么类型的数据没有任何说法。在这两种情况下malloc(512)都完全相同。 没有的区别。 malloc()保留的内存块永远不会有自己的类型。

malloc()返回指向内存块的指针。由于它不知道存储在那里的数据,这是一个空指针,一个"无类型"指针。将其分配给类型指针将产生效果:

首先,你将语义带入其中。没有人可以说,malloc()返回地址的块中存储了哪种数据。当你将它分配给一个int指针时,它会说:"该块中存有一些int。"带有char指针的模拟。

其次,当你对它进行操作时,你告诉编译器有关存储在那里的数据:I。e。如果使用char指针将值存储到内存块中pChar,则只会阻止块的一个字节。这是因为字符的大小只有一个字节。

如果使用int指针将值存储到内存块中{4},则会影响4或8(或计算机上的任何内容)。

但这取决于你引用内存块的方式,指针的类型。内存块本身仍然是无类型的。因此,您可以更改类型:

pInt

因此,内存块没有任何类型。指向内存块内存的指针为块的访问提供了一种类型。该块本身是无类型的。

答案 3 :(得分:0)

int *pInt = malloc(512)int pInt[128];

类似

char *pChar = malloc(512)char pChar[512];

类似

注意整数是4个字节大,512/4 = 128.(有时整数不是4个字节。这取决于编译器。)

块本身并没有什么不同。相反,它们不同的类型会影响编译器处理这些内存块的方式。编译器不允许您在类型之间自由切换,但无论如何都可以通过类型转换进行切换,例如(char *)pInt;

以下是操纵pIntpChar以展示其关系的一些代码。请注意使用类型转换以避免编译器错误。

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

static const int BLOCKSIZE = 8;

void print_as_chars(char *print_me)
{
    int i;
    for (i = 0; i < BLOCKSIZE; ++i)
    {
        printf ("%4d ", print_me[i]);
    }
    printf ("\n");
}

void print_as_ints(int *print_me)
{
    int i;
    for (i = 0; i < BLOCKSIZE / sizeof(int); ++i)
    {
        printf ("%19d ", print_me[i]);
    }
    printf("\n");
}

int main (void)
{
    int *pInt = malloc(BLOCKSIZE);
    char *pChar = malloc(BLOCKSIZE);

    // We can set any value in pInt
    pInt[0] = 25;
    pInt[1] = 300;

    // But represent the memory in any way we want.
    printf ("pInt:\n");
    print_as_ints(pInt); // 25 300
    print_as_chars((char *)pInt); // 0 0 0 25 0 0 1 44
    printf ("\n");

    // It works both ways!
    pChar[0] = 0; pChar[1] = 0; pChar[2] = 0; pChar[3] = 25;
    pChar[4] = 0; pChar[5] = 0; pChar[6] = 1; pChar[7] = 44;

    printf ("pChar:\n");
    print_as_ints((int *)pChar); // 25 300
    print_as_chars(pChar); // 0 0 0 25 0 0 1 44
    printf ("\n");

    return 0;
}