int main()
{
int* p= (int*)malloc(8);
for(i=0;i<128;i++)
p=0;
}
我想为所有 128 位分配全零。上面的代码是否正确?我想澄清一下。我的目标是将 128 位分配给一个变量,并将所有 0 分配给所有 128 位。
int main()
{
int* p= (int*)malloc(8);
for(i=0;i<128;i++)
p=0;
}
我想为所有 128 位分配全零。上面的代码是否正确?我想澄清一下。我的目标是将 128 位分配给一个变量,并将所有 0 分配给所有 128 位。
不,您只需将 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)你分配了 8 个字节,也就是 64 位
2)您迭代到 128,这将导致缓冲区溢出,除了:
3)在你的循环中,你只设置分配给 0 的第一个字节
有两种方法可以做到这一点:
p = malloc(128/8);
for (i = 0; i < (128/8); i++)
p[i] = 0;
或者您可以只使用所有 POSIX 操作系统中提供的 memset(3) 函数。
与其分配和清除它,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;
}
int 有时会根据平台分配 4 个字节。所以使用 char 代替:
char* p= (char*)malloc(16);
for(i=0;i<16;i++)
p[i]=0;
您可以简单地使用memset
例程来取消所需的尽可能多的字节。它看起来像这样:
uint8_t* p= (uint8_t*)malloc(16);
memset(p, 0, 16);
请注意,如果您想要 128 位(即 16 字节),则需要将 8 替换为 16。
更新:
由于整数类型的大小取决于系统,因此使用uint8_t
typedef 可以让您确信您正在使用的类型实际上是 8 位长。这个 typedef(以及其他固定大小的整数类型)可以在stdint.h
. 如果无法使用此标头,您可以自己创建这些类型定义,例如typedef unsigned char uint8_t
对于大多数系统都是如此。
如果稍后将代码移植到具有不同整数大小的系统,您不必担心大小不兼容的问题 - 您只需更改(u)intX_t
(u - 表示无符号,X - 位数)typedef。
用于calloc( )
分配和归零。
上面的代码会将 0 分配给指针,而不是内容。
要初始化内容,请使用 memset:
memset(p, 0x00, 8);
或取消引用指针:
for(i=0;i<8;i++)
p[i]=0;