我正在尝试学习 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
如果有人能帮我调试这段代码,我将不胜感激。
最佳答案
所以你的代码问题很多。与您的错误消息相关的原因是 A[k]
不是字符串,而您正试图将其作为一个字符串打印出来。
printf("%s\n",A[k]);
A[k]
是 A
指向的内存中的第 k
个元素,因为 A
声明为 char *
,这意味着 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]
分配内存,然后直接在其中构建您想要的字符串。
关于c - 指向整数转换错误的不兼容指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44681067/