Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向整数转换错误的不兼容指针_C_Arrays_Malloc_Return Type - Fatal编程技术网

C 指向整数转换错误的不兼容指针

C 指向整数转换错误的不兼容指针,c,arrays,malloc,return-type,C,Arrays,Malloc,Return Type,我试图学习c语言,其中main函数调用其他返回数组的函数(例如字符串类型) 然而,我得到了以下一些警告 warning: format specifies type 'char *' but the argument has type 'char' incompatible pointer to integer conversion assigning to 'char' from 'char [100]' [-Wint-conversion] 当我运行程序时,我得到以下错误: Seg

我试图学习c语言,其中main函数调用其他返回数组的函数(例如字符串类型)

然而,我得到了以下一些警告

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);

或者,您可以完全抛弃
字符串
,为
A[k]
分配内存,并直接构建您想要的字符串。

因此,您的代码存在很多问题。与错误消息相关的原因是
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@Olaf代码中没有类型“string”,我可能命名错误,但我认为“A”是“array_return”函数中的指针。引用此“
sprintf(string,“%s%i”,string,k);
”:From
man sprintf
:“DESCRIPTION[…]C99和POSIX.1-2001规定,如果对sprintf()、snprintf()、vsprintf()或vsnprintf()的调用会导致在重叠的对象之间进行复制(例如,如果目标字符串数组和提供的一个输入参数引用同一缓冲区),则结果是未定义的。但是你可以传递一个指针。阅读并使用调试器。您的代码有很多问题。“例如字符串类型”在C@Olaf代码中没有类型“string”,我可能命名错误,但我认为“A”是“array_return”函数中的指针。引用此“
sprintf(string,“%s%i”,string,k);
”:From
man sprintf
:“DESCRIPTION[…]C99和POSIX.1-2001规定,如果调用sprintf()、snprintf()、vsprintf()或vsnprintf()会导致在重叠的对象之间进行复制(例如,如果目标字符串数组和提供的一个输入参数引用同一缓冲区),则结果是未定义的。”谢谢@Chris的建议和澄清。谢谢@Chris的建议和澄清。