c - 数组值不更新
问题描述
我有一个 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 进行调试,并在每一行之后检查局部变量的值。p
用arr[j]
inside更新,tokenizer
但一旦tokenizer
完成并且帧移回 ,就会变为零main
。
p
in的值main
不会变成NULL
,而是变成空字符串,并打印出来!
但是,如果包含in ,则p
inmain
打印令牌。printf
tokenizer
这已经包括解决方法。我知道这不可能是实现 strtok 的方式。我从一个更复杂的“专家”版本开始,它有指针,但无法让它工作,所以选择了这个“初学者”版本。
解决方案
这是因为您的指针指向堆栈中的内存地址,一旦您的函数返回,指向的内存地址不再存在,您需要创建动态分配的内存来访问函数外部的变量。之美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 中的内存以防止内存泄漏。
推荐阅读
- reactjs - Django 不加载构建/静态文件 ReactJS
- javascript - 使用简单功能进行字段级验证时遇到问题
- html - 我是否正确地将变量传递给方法?
- java - 抽象类还是强制转换?
- html - 无法登录系统并出现 Whitelabel 错误页面错误
- verilog - 8 位 ALU 的问题:程序不会停止,我需要验证是否达到规范
- python - 如何在我的数据框中添加一列,其中包含来自另一个数据框的年份之间的平均值?
- graphql - 使用 Graphql 和 Amplify/AppSync 基于先前值的突变
- python - 我如何告诉 Nbconvert:“请使用 pdfLaTeX 代替 XeLaTeX”
- reactjs - 离子 5,反应,电容器,fetchFirestoreCollection 错误