c - 使用 malloc 分配字符串

标签 c string malloc

我是 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/

相关文章:

c - 第一次调用 strtok() 总是在我的 char* 数组中写入 0

c - 通过结构进行测量并搜索最低,最高和平均温度

c - 如何使用strchr在c中获取子字符串

c - 尝试释放内存时出错

c - 抑制用户定义的函数输出?

string - 获取 R 中因子中最常见的元素

Java:查找两个数据源中出现了多少个单词?

c - 在程序运行时分配内存

c++ - 从 C++ 中的函数返回 2D 字符数组并打印它

C函数没有返回正确的结果