我试图创建一个扫描字符串并创建一维字符串数组的函数。
编译时我遇到了这个错误:
return从没有强制转换的整数中生成指针
此功能的代码在这里:
char **insert_strings(int *n) {
char **strings;
char *string;
strings=(char **)malloc((*n)*sizeof(char*));
for(int i=0;i<(*n);i++)
strings[i]=(char*)malloc(30*sizeof(char));
for(int i=0;i<(*n);i++) {
scanf("%s",string);
strcpy(strings[i],string);
}
return **strings;
}
答案 0 :(得分:4)
返回strings
而不是**strings
。 **strings
是char
。
答案 1 :(得分:2)
根据上下文,无需取消引用strings
,您应该使用return strings;
。
答案 2 :(得分:2)
您的函数被删除以返回指向char 的指针的指针,但您只返回 char 。
引起这种混淆是因为*
一元运算符可以有两个含义:
在变量和函数定义中,*
表示:"this variable (or this
function) is a pointer"
。因此,char **insert_strings(int *n)
返回指向char 指针的指针,而char **strings
是指向char 指针的指针。
在定义之外,一元*
运算符是引用运算符,而*a
表示:"the object that is at the location indicated by the value of a"
。
假设我们在计算机内存中存在这种情况:
Addresses 1 | 2 | 3 | 4 | 5 | 6
Values 5 | 3 | 6 | 9 | 2 | 9
例如,如果变量strings
的地址(在您的代码中定义)为5,则其值为2。
因此,*strings
的值是位置2处的值,即3。
**strings
是*strings
指向的位置的值。该
*strings
的值为3,因此**strings
的值为6.
话虽如此,我会解释你为什么会得到错误:insert_strings()
应该返回指向char的指针的值,在你的代码中它是strings
的值(2在我们的示例中),但是您返回**strings
的值(在我们的示例中为6),这是一个char而不是指针。
要修复代码,您只需更改
即可return **strings;
到
return strings;
您的代码还存在其他一些问题,这些问题不会导致编译时错误,但必须更正,因为它们可能会导致运行时错误。
n
不应该是指针。它正在计算您要输入的字符串数,因此它应该只是一个int。scanf()
获取输入字符串;我会解释你为什么。在您的程序中,您为变量string
分配30个字符的空间。现在,如果有人输入超过30个字符会发生什么?如果幸运的话,程序将终止。如果你不是,它可能会崩溃,你不知道在哪里找到这个bug。解决方案是使用fgets(char *s, int size, FILE *stream)
。此功能是安全的,因为您可以告诉它用户可以输入多少个字符。在您的示例中,您将按如下方式使用它:fgets(string, 30, stdin);
最后,我想建议你做一些更好的计划:
malloc()
的返回值,不要强制转换它:它是无用且冗余的。 (有关更多信息,请参阅Deduplicator对您的问题的评论)。sizeof(char)
始终等于1.编写它是没用的。strings
变量:您不需要string
变量,如果没有它,您可以做得很好。根据我的说法,你的代码应该是这样的:
#include <stdio.h> /* Needed for fgets() */
#include <stdlib.h> /* Needed for malloc() */
/* char **insert_strings(int n)
* Gets n strings from input and puts them inside an array of strings.
* Arguments: n is the number of lines that will be got from input.
* Return value: the array of strings, or NULL if it couldn't be allocated. */
char **insert_strings(int n)
{
/* strings is a pointer to array */
char (*strings)[30];
if((strings = malloc(n)) == NULL)
return NULL;
/* The loop that gets the input.
* We use fgets() because it's safe.
* 30 is the number of characters that we can get for every string.
* stdin is the standard input, which is usually the keyboard. */
for (int i = 0; i < n; i++)
fgets(strings[i], 30, stdin);
return strings;
}
答案 3 :(得分:0)
你应该有返回字符串; (没有**)。一切都应该没问题。
答案 4 :(得分:0)
为什么要返回**字符串,当你已经把它作为(字符**)? 只返回String。这就足够了。