int main()
{
int* p= (int*)malloc(8);
for(i=0;i<128;i++)
p=0;
}
我想为所有128位分配所有零。以上代码是否正确?我想澄清一下。我的目标是将128位分配给一个变量并将所有零分配给所有128位。
答案 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( )
分配和归零。