首页 > 解决方案 > 数组值不更新

问题描述

我有一个 strtok 实现(有点),但它不打印令牌!

char *tokenizer(char s[], const char *delimiter) {
     char *p;                   //return value of function
     int i = 0;
     while(s[i] != *delimiter)  //to get the size of array just right
         i++;

     char arr[i+1];
     p = arr;                  //can't return an array, so assigned to a
                               //pointer       
     int j = 0;
     i = 0;
     while(s[i]!=*delimiter) {
           arr[j] = s[i];
           i++;
           j++;
     }
     arr[j] = '\0';     
     printf("%s\n",p);         //this statement works, but if excluded
                               //main prints nothing.
     return p;
}

此函数从主要调用如下:

char s[] = "tab-tab";
const char del[2] = "-";
char *p;
p = tokenizer(s, del);
printf("%s\n", p);        //prints nothing without the printf in
                          //tokenizer

我尝试使用 gdb 进行调试,并在每一行之后检查局部变量的值。parr[j]inside更新,tokenizer但一旦tokenizer完成并且帧移回 ,就会变为零main

pin的值main不会变成NULL,而是变成空字符串,并打印出来!

但是,如果包含in ,则pinmain打印令牌。printftokenizer

这已经包括解决方法。我知道这不可能是实现 strtok 的方式。我从一个更复杂的“专家”版本开始,它有指针,但无法让它工作,所以选择了这个“初学者”版本。

标签: cgdbprintfstrtok

解决方案


这是因为您的指针指向堆栈中的内存地址,一旦您的函数返回,指向的内存地址不再存在,您需要创建动态分配的内存来访问函数外部的变量。之美C

char *tokenizer(char s[], const char *delimiter) {
    char *arr;

    int i = 0;
    while(s[i] != *delimiter)
        i++;
    // Initialize variable in the heap
    if (!(arr = malloc(sizeof(char *) * (i+1))))
        return NULL;
    // Clear the array
    bzero(arr, (i+1));      
    int j = 0;
    i = 0;
    while(s[i]!=*delimiter) {
        arr[j] = s[i];
        i++;
        j++;
    }
    arr[j] = '\0';
    // return pointer
    return arr;
}

您应该确保释放 main 中的内存以防止内存泄漏。


推荐阅读