所以我试图在从函数返回后打印出 char* 数组,但我不断收到段错误。
char* return(node *n){
node* p = list->head;
int count = 0;
int size = 0;
while(p != NULL){
size += strlen(p->name);
count++;
p = p->nxt;
}
size = size + 1; // for the '\0'
char * arr[count][size];
p = list->head;
count = 0;
while(p != NULL){
strcpy(arr[count], p->name);
count++;
p = p->next;
}
return arr;
}
然后我去尝试在某个节点上的 main 方法中打印它。我遇到了分段错误。
char* test = return(node1);
for(i = 0; i < 5; i++){
printf("%s", test[i]);
}
您的
arr
是(不幸命名的)函数的本地函数。当函数退出时,空间被释放。如果您之后使用该指针,您将索引到未知的位置,并且很可能是您不应该索引的地方(这会导致段错误)。
当你想在函数中分配空间并返回指针时,你应该使用
malloc
(或等效的),并记住之后 free
空间。另一种方法是让指针成为函数的参数,并将分配(和释放)的责任留给调用者(就像 fgets
所做的那样)。
方法一(函数内部分配):
char *foo() {
char *arr = malloc(100);
return arr;
}
/* somewhere else */
char *arr = foo();
/* use arr */
free(arr);
方法2(函数外分配):
void foo(char *arr, size_t size) {
/* do stuff to arr */
}
/* somewhere else */
char *arr = char[100];
foo(arr, 100);
编辑:错了。忽略这里的东西。