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

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

}

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

4

7 回答 7

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);
}
于 2012-08-08T11:08:13.787 回答
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) 函数。

于 2012-08-08T11:09:01.483 回答
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;
}
于 2012-08-08T11:15:25.980 回答
1

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

char* p= (char*)malloc(16);
for(i=0;i<16;i++)
    p[i]=0;
于 2012-08-08T11:12:34.100 回答
1

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

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

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

更新:

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

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

于 2012-08-08T11:08:37.677 回答
0

用于calloc( )分配和归零。

于 2012-08-08T12:59:35.577 回答
0

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

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

memset(p, 0x00, 8);

或取消引用指针:

for(i=0;i<8;i++)
    p[i]=0;
于 2012-08-08T11:07:47.993 回答