是否可以将所有零分配给128位的所有位?

时间:2012-08-08 11:04:53

标签: c

int main()
{
    int* p= (int*)malloc(8);

    for(i=0;i<128;i++)
    p=0;

}

我想为所有128位分配所有零。以上代码是否正确?我想澄清一下。我的目标是将128位分配给一个变量并将所有零分配给所有128位。

7 个答案:

答案 0 :(得分:5)

没有。您只需将0指定给指针本身(这样就会丢失它并泄漏内存)。使用此:

(编辑:正如Jim Balter指出的那样,处理非8位字符很容易:)

int main()
{
    unsigned n = (128 + CHAR_BIT - 1) / CHAR_BIT;
    unsigned char *p = malloc(n);

    for(i = 0; i < n; i++)
    p[i] = 0;
}

但这是重新发明轮子。为什么不使用标准函数memset()

int main()
{
    unsigned n = (128 + CHAR_BIT - 1) / CHAR_BIT;
    unsigned char *p = malloc(n);

    memset(p, 0, n);
}

答案 1 :(得分:2)

哇,有那么多可以分开......

1)你分配8个字节,即64位

2)你迭代到128,这将导致缓冲区溢出,除了:

3)在你的循环中你只设置分配给0的第一个字节

有两种方法可以做到这一点:

p = malloc(128/8);
for (i = 0; i < (128/8); i++)
    p[i] = 0;

或者您可以使用所有POSIX操作系统中提供的memset(3)函数。

答案 2 :(得分:2)

我认为calloc()会更好,而不是分配和清除它。

int* p= (int*)malloc(8);

您分配了8个字节,即8 * 8 = 64位。

#include <stdio.h>
#include <stdlib.h>
int main()
{

int i = 0;
char *p = calloc(16, sizeof(char));

//for Testing
for(i = 0; i < 16; i++)
  printf("%d\t", *p++);

return 0;
}

答案 3 :(得分:1)

您可以简单地使用memset例程来取消您所使用的字节数。它看起来像这样:

uint8_t* p= (uint8_t*)malloc(16);
memset(p, 0, 16);

请注意,如果您需要128位(16字节),则需要将8位替换为16位。

<强>更新

由于整数类型的大小取决于系统,因此使用uint8_t typedef可以确保您使用的类型实际上是8位长。可以在stdint.h中找到此typedef(以及其他固定大小的整数类型)。如果无法使用此标头,您可以自己创建这些typedef,例如typedef unsigned char uint8_t适用于大多数系统。

如果稍后将代码移植到具有不同整数大小的系统,则不必担心大小不兼容的问题 - 您只需更改(u)intX_t(u - 对于无符号,X - 比特数)typedef。

答案 4 :(得分:1)

int有时会根据平台分配4个字节。所以请改用char:

char* p= (char*)malloc(16);
for(i=0;i<16;i++)
    p[i]=0;

答案 5 :(得分:0)

上面的代码将0分配给指针,而不是内容。

要初始化内容,请使用memset:

memset(p, 0x00, 8);

或取消引用指针:

for(i=0;i<8;i++)
    p[i]=0;

答案 6 :(得分:0)

使用calloc( )分配和归零。