我想创建一个带有char *的函数,用strtok()标记它并返回带有所有参数的char **。每次尝试执行时,我都会收到Segmentation Fault错误。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH 10
char ** boom(char * line, int * lng){
size_t size = strlen(line )+1;
int tksize = *lng;
const char d[2] = " ";
char a[size];
memcpy(a, line , size);
char ** tk = (char**) malloc(tksize*sizeof(char*));
int i=0;
char* token = strtok(a, d);
while(token!=NULL){
tk[i] = token;
i++;
token = strtok(NULL, d);
}
return tk;
}
int main(void){
int i, lng = LENGTH;
char * string = "this is a beutiful message.\0";
char ** tk = boom(string , &lng);
for (i=0; i<lng; i++){
printf("%s\n", tk[i]);
}
return 0;
}
我需要返回类型的boom()为char **,所以我还没有使用返回类型的char * []。我怀疑它是char ** malloc.Thanks的帮助。
答案 0 :(得分:1)
让strtok
对局部变量char a[size]
进行操作,因此char* token = strtok(a, d)
将指向堆栈上分配的内存。函数boom
完成后,此内存将不再有效,这就是段错误的原因。
答案 1 :(得分:0)
char a[size];
是一个分配了自动存储持续时间的数组,这意味着一旦从该函数返回,a
就会被释放。由于您使用a
而不是line
和strtok
,因此函数boom
返回的值是指向不再能够访问的内存部分的指针数组
编辑:strtok
用于处理可写字符串,因此char * string = "...";
函数中的main
并非真正正确(字符串文字不可写),这可能是为什么你首先需要a
。如果使用char string[] = "...";
代替,那么事情就可以在不需要数组a
的情况下工作,因为字符串文字中的字符将被复制到足够大小的数组中。您只需在line
函数中使用a
代替boom
。
如果您希望它也使用只读字符串,您还需要将tk
数组中的每个项目分配为char
的数组(即{{1在i = 0到tk[i] = malloc(toklen * sizeof *tk[i]);
)的循环中:
tksize