我正在尝试学习c,其中main函数调用一些其他函数返回一个数组(例如字符串类型)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* array_return(char* name);
int main(){
char* name="orange";
char* A;
A=array_return(name);
free(A);
printf("%s\n","Check stored values in A");
int k,n;
n=10;
for (k=0; k < n; k++) {
printf("%s\n",A[k]);
}
return 0;
}
char* array_return(char* name){
int k,n;
n=10;
char* A=malloc(n);
char string[100];
printf("%s\n","Store values in A");
for (k=0; k < n; k++) {
strcpy(string,"Numer of ");
strcat(string,name);
strcat(string," are: ");
sprintf(string,"%s %i",string,k);
A[k]=string;
printf("%s\n",A[k]);
}
printf("%s\n","--------------------------");
return A;
}
我正在尝试将以下值存储在数组“A”中:
Numer of orange are: 0
Numer of orange are: 1
Numer of orange are: 2
Numer of orange are: 3
Numer of orange are: 4
Numer of orange are: 5
Numer of orange are: 6
Numer of orange are: 7
Numer of orange are: 8
Numer of orange are: 9
但是,我收到了一些警告
warning: format specifies type 'char *' but the argument has type
'char'
incompatible pointer to integer conversion assigning to 'char'
from 'char [100]' [-Wint-conversion]
并且,当我运行程序时出现以下错误:
Segmentation fault: 11
如果有人可以帮我调试这段代码,我将非常感激。
答案 0 :(得分:3)
所以代码的问题很多。与您的错误消息相关的一个原因是A[k]
不是字符串,而您尝试将其打印为一个字符串。
printf("%s\n",A[k]);
A[k]
是k
指向的内存的A
元素,因为A
被声明为char *
,这意味着{{1}类型为A[k]
。要执行您要执行的操作,您希望char
实际上被声明为A
。
char **
但是您的代码在技术上仍然无法正常工作,因为将char **A=malloc(sizeof(*A)*n); // We need n lots of what A points to
分配给string
只会将A[k]
指向的string
分别复制到A
的每个元素中,所以它们都将是相同。也就是说,直到该函数完成,然后您进入未定义行为领域,因为string
使用的内存不再有效。
所以你要做的是将string
中的字符串复制到A[k]
指向的新字符串中。最简单的方法是使用strdup
,因为它将为您的字符串分配空间并在一次函数调用中复制它。
A[k]=strdup(string);
或者,你可以完全抛弃string
并为A[k]
分配内存并直接构建你想要的字符串。