数组值不更新

时间:2018-05-10 08:41:32

标签: c gdb printf strtok

我有一个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;
}

此函数从main:

调用如下
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进行调试,并在每一行之后检查局部变量的值。 p已在arr[j]内更新为tokenizer,但tokenizer完成后会转为零,并且框架会移回main

pmain的值不会变为NULL,它会变为空字符串,并打印出来!

但是,如果p中包含main,则printf中的tokenizer会打印令牌。

这已经包含了解决方法。我知道这可能是实施strtok的方式。我从一个更复杂的,#34;熟练的"开始有指针的版本,但无法使它工作,因此已经适应了这个"初学者"版本

1 个答案:

答案 0 :(得分:1)

这是因为你的指针指向堆栈中的内存地址,一旦你的函数被返回,指向的内存地址不再存在,你需要创建动态分配的内存来访问函数之外的变量。 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;
}

您应该确保释放主内存以防止内存泄漏。