关于动态分配字符串的小问题,我该如何解决?
little question about a thing when it comes to dynamically allocate a string, how can I solve?
(这道题全是理论题)
快速怀疑,我不知道该怎么做:我需要执行 malloc 来存储其长度加上 1 个零终止符的字符串。因此我必须写:
char* str = malloc(length + 1),为了避免缓冲区overflow/buffer溢出,我想到了这个解决方案:
int sum = length + 1;
if (sum > char storage limit) {
exit(1);
} else {
char* str = malloc(length + 1);
NULL POINTER EXCEPTION CHECK.
}
好的,这可以工作,但我不知道我应该写什么而不是“字符存储大小”。
知道char取值范围是-128
编辑:也许,我可以这样使用 sizeof 运算符:sizeof(char)。代码将变为:
int sum = length + 1;
if (sum > sizeof(char)) {
exit(1);
} else { /* same way */ }
但因为这种整数类型是机器相关的,它们的存储大小可能会有所不同,因此我认为我应该写成 int8_t,因为 stdint 函数总是具有相同的存储大小。你怎么看?
您错误地理解了编译器消息。
首先是编译错误
if (sum > )
^^^
编译器指向它。
其次,该消息意味着您应该使用 size_t
.
类型,而不是变量 length
的类型 int
此消息与缓冲区溢出没有任何共同之处。这意味着表达式 length + 1
会导致整数溢出。
注意sizeof( char )
、sizeof( signed char )
和sizeof( unsigned char )
总是等于1
。
(这道题全是理论题)
快速怀疑,我不知道该怎么做:我需要执行 malloc 来存储其长度加上 1 个零终止符的字符串。因此我必须写: char* str = malloc(length + 1),为了避免缓冲区overflow/buffer溢出,我想到了这个解决方案:
int sum = length + 1;
if (sum > char storage limit) {
exit(1);
} else {
char* str = malloc(length + 1);
NULL POINTER EXCEPTION CHECK.
}
好的,这可以工作,但我不知道我应该写什么而不是“字符存储大小”。
知道char取值范围是-128 编辑:也许,我可以这样使用 sizeof 运算符:sizeof(char)。代码将变为: 但因为这种整数类型是机器相关的,它们的存储大小可能会有所不同,因此我认为我应该写成 int8_t,因为 stdint 函数总是具有相同的存储大小。你怎么看?int sum = length + 1;
if (sum > sizeof(char)) {
exit(1);
} else { /* same way */ }
您错误地理解了编译器消息。
首先是编译错误
if (sum > )
^^^
编译器指向它。
其次,该消息意味着您应该使用 size_t
.
length
的类型 int
此消息与缓冲区溢出没有任何共同之处。这意味着表达式 length + 1
会导致整数溢出。
注意sizeof( char )
、sizeof( signed char )
和sizeof( unsigned char )
总是等于1
。