Malloc没有为char分配内存*

Malloc没有为char分配内存*,c,string,char,malloc,C,String,Char,Malloc,我用malloc()和字符串得到了一个简单、意外的结果。 守则: int main(void) { char* b64str; char* binStr = "00000101"; printf("Expected size of allocated structure (b64str): 8\n"); b64str = (char*)malloc((strlen(binStr)+1)*sizeof(char)); printf("Actual size of allocated struc

我用malloc()和字符串得到了一个简单、意外的结果。 守则:

int main(void) {

char* b64str;
char* binStr = "00000101";

printf("Expected size of allocated structure (b64str): 8\n");
b64str = (char*)malloc((strlen(binStr)+1)*sizeof(char));
printf("Actual size of allocated structure (b64str): %d\n\n", strlen(b64str));
输出:

Expected size of allocated structure (b64str): 8
Actual size of allocated structure (b64str): 0

为什么?

您为
b64str
分配了空间,但该空间未初始化。试图调用该缓冲区调用的
strlen
。在您的特定情况下,第一个字节碰巧被设置为0,但您不能依赖于该行为

您无法通过查看来判断分配了多少内存。你需要自己跟踪它

如果要查看分配是否失败,请检查返回的指针是否为
NULL

b64str = (char*)malloc((strlen(binStr)+1)*sizeof(char));
if (b64str == NULL) {
    perror("malloc failed");
    exit(1);
}

您已将空间分配给
b64str
,但该空间未初始化。试图调用该缓冲区调用的
strlen
。在您的特定情况下,第一个字节碰巧被设置为0,但您不能依赖于该行为

您无法通过查看来判断分配了多少内存。你需要自己跟踪它

如果要查看分配是否失败,请检查返回的指针是否为
NULL

b64str = (char*)malloc((strlen(binStr)+1)*sizeof(char));
if (b64str == NULL) {
    perror("malloc failed");
    exit(1);
}
strlen()
在字符串中搜索NUL终止符。它不会告诉您为该字符串分配的缓冲区大小!(您的第一个字节碰巧是零;其他运行可能会产生不同的结果。)

因此,如果需要,您必须自己存储缓冲区的大小。如果要查看是否分配了任何内存,请检查
b64str
本身是否为
NULL

strlen()
在字符串中搜索NUL终止符。它不会告诉您为该字符串分配的缓冲区大小!(您的第一个字节碰巧是零;其他运行可能会产生不同的结果。)

b64str = (char*)malloc((strlen(binStr)+1)*sizeof(char));
if (b64str == NULL) {
    perror("malloc failed");
    exit(1);
}
因此,如果需要,您必须自己存储缓冲区的大小。如果要查看是否分配了任何内存,请检查
b64str
本身是否为
NULL

strlen()
报告的是字符串的长度,而不是与分配相关的内存量

b64str = (char*)malloc((strlen(binStr)+1)*sizeof(char));
if (b64str == NULL) {
    perror("malloc failed");
    exit(1);
}
strlen
函数返回终止空字符之前的字符数。C11dr§7.24.6.3 3


考虑对OP代码进行修改

char* binStr = "00000101";
printf("Result of strlen(binStr) %d\n", (int) strlen(binStr));
// Expect 8 to be printed.

char* b64str = (char*)malloc((strlen(binStr)+1)*sizeof(char));

strcpy(b64str, "123");
printf("Result of strlen(b64str) %d\n", (int) strlen(b64str));
// Expect 3 to be printed.

strcpy(b64str, "12345");
printf("Result of strlen(b64str) %d\n", (int) strlen(b64str));
// Expect 5 to be printed.
所有这些都没有打印分配大小是9。请注意,
b64str
指向的分配内存量即使在
strcpy(b64str,“123”)之后仍然保持为9


没有标准的方法来确定与从
malloc()
返回的非
NULL
指针关联的内存量


malloc
未为
char*
分配内存(OP)

代码没有检查malloc()的返回值以了解分配是否成功。执行
NULL
检查。如果代码接收到非空值,则分配成功。当大小请求为0时,
NULL
的返回值也可以,但这不是strlen(binStr)+1
的问题

malloc函数返回空指针或指向分配空间的指针。§7.22.3.4 2


注:

不需要强制转换malloc()返回。
sizeof(char)
始终为1。
鲁棒代码检查分配结果

char* b64str = malloc(strlen(binStr)+1);
if (b64str == NULL) { perror("OOM"); exit(-1); }
使用
“%zu”
匹配从
strlen()返回的类型
size\t

strlen()
报告字符串的长度,而不是与分配相关的内存量

strlen
函数返回终止空字符之前的字符数。C11dr§7.24.6.3 3


考虑对OP代码进行修改

char* binStr = "00000101";
printf("Result of strlen(binStr) %d\n", (int) strlen(binStr));
// Expect 8 to be printed.

char* b64str = (char*)malloc((strlen(binStr)+1)*sizeof(char));

strcpy(b64str, "123");
printf("Result of strlen(b64str) %d\n", (int) strlen(b64str));
// Expect 3 to be printed.

strcpy(b64str, "12345");
printf("Result of strlen(b64str) %d\n", (int) strlen(b64str));
// Expect 5 to be printed.
所有这些都没有打印分配大小是9。请注意,
b64str
指向的分配内存量即使在
strcpy(b64str,“123”)之后仍然保持为9


没有标准的方法来确定与从
malloc()
返回的非
NULL
指针关联的内存量


malloc
未为
char*
分配内存(OP)

代码没有检查malloc()的返回值以了解分配是否成功。执行
NULL
检查。如果代码接收到非空值,则分配成功。当大小请求为0时,
NULL
的返回值也可以,但这不是strlen(binStr)+1
的问题

malloc函数返回空指针或指向分配空间的指针。§7.22.3.4 2


注:

不需要强制转换malloc()
返回。
sizeof(char)
始终为1。
鲁棒代码检查分配结果

char* b64str = malloc(strlen(binStr)+1);
if (b64str == NULL) { perror("OOM"); exit(-1); }
使用
“%zu”
匹配从
strlen()返回的类型
size\t


请提供您期望该值的原因。最好参考文档和标准。
b64str
指向新分配的内存,其中可能包含任何值。在您的系统上,在特定的运行中,内存的开头包含一个NUL字符。您确实不应该在存储任何内容之前访问内存,如果您要使用它,Valgrind将识别此错误。请提供您期望该值的原因。最好参考文档和标准。
b64str
指向新分配的内存,其中可能包含任何值。在您的系统上,在特定的运行中,内存的开头包含一个NUL字符。您确实不应该在存储任何内容之前访问内存,如果您要使用它,Valgrind将识别此错误。