将字符串数组传递给函数并修改它会破坏它

时间:2017-01-22 00:29:18

标签: c

我目前正在用C语言编写一种小编程语言。我从文件中加载一个脚本,然后使用strtok对其进行标记。问题是虽然在tokenizer函数中输出很好并且给了我预期的结果,但是当函数返回main时数据被破坏,给我输出如下:

╠ a

而不是预期的:

int

我没有很多C语言的经验,但我最好的猜测是这是一个空终止问题,虽然我已经读过strtok会自动这样做。

以下是相关代码:

int tokenize(char* script, char* tokens[]) {
    char buffer[256];
    strcpy(buffer, script);

    char* token = strtok(buffer, " ");
    int i = 0;
    while (token) {
        tokens[i] = token;
        printf("token: %s\n", token);
        token = strtok(NULL, " ");
        i++;
    }
    printf("First token (tokenize): %s\n", tokens[0]);

    return i;
}


int main(int argc, char* argv[]) {
    // ....
    char* script = read_script(argv[1]);

    char* tokens[256];
    int token_count = tokenize(script, tokens);
    printf("First token (main): %s\n", tokens[0]);
    // ...
}

这是控制台输出:

token: int
token: i
token: =
token: 0

First token (tokenize): int
First token (main): ╠ a

3 个答案:

答案 0 :(得分:2)

您返回指向本地变量中的标记的指针:

{"name":"paste","sender":{"$":{"form_select_standardlanguage": 
{"0":{},"1":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{}},"2":
{"0":{},"1":{}}},"location":{"href":"http://somehost.com
/somefile.php","origin":"http: 
//somehost.com","protocol":"http:","host":"somehost.com", 
"hostname":"somehost.com","port":"","pathname":   
"/somefile.php","search":"?searchkey=somekey","hash":""},
"data-cke-expando":102}},"data":{"$":{"isTrusted":true}}}
<{1}}返回后

int tokenize(char* script, char* tokens[]) { char buffer[256]; ... 不再存在。

答案 1 :(得分:1)

您的tokenize - 调用对局部变量tokens[]进行操作,并且 tokens[i] = strdup(token); 返回后,为此变量保留的内存不再有效。因此, tokens[i] = token; 中的任何指针都将指向(无效)内存。

为了解决这个问题,我写了

token[i]

代替

M

一旦不再需要这些元素,请确保调用者释放为每个decimal元素保留的内存。

答案 2 :(得分:0)

令牌指向的内存空间(缓冲区)位于堆栈中。因此,当&#34; tokenize&#34;功能结束时,该空间就会消失。 所以,你和#34;令牌&#34;变量必须指向堆区域。(通过使用malloc或calloc。)