我是 C 语言编程的新手,现在我正在研究字符串。
我的问题是:如果我使用 malloc
分配一个字符串(如下面的代码),NULL 字符是否会自动插入到字符串的末尾?
我在这里找到另一个问题的答案,似乎没有自动包含 NULL 字符。
但问题来了:我知道如果没有 NULL 字符,像 strlen
这样的函数就不起作用,在这段代码中我使用了它并且它起作用了。所以我认为我的字符串末尾有 \0
,即使我没有在任何地方写它。
答案是什么?
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv) {
char *stringa1;
int n;
int i;
printf("How many characters in the string? ");
scanf("%d", &n);
stringa1 = (char*) malloc(n*sizeof(char));
printf("Insert the string: ");
scanf("%s", stringa1);
free(stringa1);
return 0;
}
最佳答案
malloc()
返回一个指向存储在堆中的内存块的 void*
指针。使用malloc()
分配不会初始化任何字符串,只有空间等待被占用。要添加一个空终止字符,你要么自己做,要么使用像scanf这样的函数()
,它为你添加了这个字符。话虽如此,你需要事先为这个\0
字符分配空间。
您的 malloc()
调用应该是这样的:
stringa1 = (char*) malloc((n+1)*sizeof(char)); /*+1 for '\0' character */
注意:您不需要强制返回 malloc。有关详细信息,请阅读 this .
要指出的另一件事是 sizeof(char)
是 1
,因此在您的 malloc()
调用中不需要乘以它。
您还需要检查 malloc()
是否返回 NULL
。这可以像这样完成:
if (stringa1 == NULL) {
/* handle exit */
此外,您只能在以 null 结尾的字符串上使用 strlen()
,否则最终会是 undefined behaviour .
一旦 scanf()
被调用,并且 stringa1
包含一些字符,您可以对其调用 strlen()
。
此外,检查 scanf()
的返回值也是一个好主意。你可以这样检查:
if (scanf("%d", &n) != 1) {
/* handle exit */
您的代码进行了这些更改:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char *stringa1 = NULL;
size_t n, slen;
printf("How many characters in the string? ");
if (scanf("%zu", &n) != 1) {
printf("Invalid input\n");
exit(EXIT_FAILURE);
}
stringa1 = malloc(n+1);
if (stringa1 == NULL) {
printf("Cannot allocate %zu bytes for string\n", n+1);
exit(EXIT_FAILURE);
}
printf("Insert the string: ");
scanf("%s", stringa1);
slen = strlen(stringa1);
printf("String: %s Length: %zu\n", stringa1, slen);
free(stringa1);
stringa1 = NULL;
return 0;
}
关于c - 使用 malloc 分配字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41830461/