返回指向char *的指针会破坏数据

nswerhun

我正在尝试编写一个函数,该函数将沿空格(' '分割字符串而不更改原始字符串,将所有标记放入数组中,然后返回该数组。我遇到的问题是返回指针。下面是我的代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char **split_line(char *ln) {
    char **tokens, *tok, line[256];
    int j;

    strcpy(line, ln);

    tokens = calloc(64, sizeof(char*));
    for (int i = 0; i < 64; i++)
        tokens[i] = calloc(64, sizeof(char));

    tokens[0] = strtok(line, " ");
    for (j = 1; (tok = strtok(NULL, " ")) != NULL && j < 63; j++) 
        tokens[j] = tok;
    tokens[j] = NULL;

    return tokens;
}

int main(void) {
    char **cut_ln, *input;

    input = "Each word in this string should be an element in cut_ln.";
    cut_ln = split_line(input);

    printf("`%s`\n", input);
    for (int i = 0; cut_ln[i] != NULL; i++)
        printf("[%d]: `%s`\n", i, cut_ln[i]);

    return 0;
}

运行时,将给出:

`This word in this string should be an element in cut_ln.`
[0]: `This`
[1]: `wo1`
[2]: `�={G+s`
[3]: `G+s`
[4]: `string`
[5]: ``
[6]: `0����`
[7]: `��`
[8]: ``
[9]: ``
[10]: ``

当我尝试打印的内容tokenssplit_line功能,它提供了预期的结果。但是,当tokens返回并分配给变量,然后打印时,它会如上所示给出上面的结果。我究竟做错了什么?

大卫·施瓦兹

返回时tokens,它包含从返回的指针strtok,这些指针是的指针line但目前line已不存在。

您已分配内存,并使tokens指向该已分配内存的各种元素指向该内存。不要用从返回的值覆盖这些值strtok

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章