当我尝试编译下面的代码时,我不断收到以下错误。我在网上搜索了错误的含义,但似乎没有任何东西适合我的代码。请有人告诉我在malllocing下面的字符串我出错了。我想在那个阵列中制作5个单位,这是第一个单位。
错误:
assignment4.c: In function ‘readFile’:
assignment4.c:42:19: warning: assignment makes integer from pointer without a cast [enabled by default]
assignment4.c:44:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
代码:
void readFile()
{
char * listofdetails;
listofdetails = malloc(sizeof(char)*40);
listofdetails[1] = "cars";
printf("%s \n", listofdetails[1]);
free(listofdetails);
}
答案 0 :(得分:2)
使用strcpy
(不要忘记#include <string.h>
):
strcpy(listofdetails, "cars");
另外,"%s"
,如果要打印字符串,则需要一个字符串,而不是char
printf("%s \n", listofdetails);
是你想要的。
如果要打印字符串中的第一个字符:
printf("%c \n", listofdetails[0]);
但是如果你想要一个详细信息列表(顾名思义),你需要为n字符串(char **)
的列表保留空间,并为每个字符串(char *)
保留空间:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern char *strdup(const char *);
int main(void)
{
char **listofdetails = malloc(sizeof(*listofdetails) * 40);
if (listofdetails == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
listofdetails[0] = strdup("cars");
if (listofdetails[0] == NULL) {
perror("strdup");
exit(EXIT_FAILURE);
}
printf("%s\n", listofdetails[0]);
free(listofdetails[0]);
free(listofdetails);
return 0;
}
请注意,strdup
不是标准的一部分(但在许多实现中都可用)。
最后,如果在编译时知道这些字符串,则根本不需要使用malloc
:
const char *listofdetails[] = {
"cars",
"trucks",
"motorcycles",
/* etc */
};
答案 1 :(得分:1)
两行
char * listofdetails;
listofdetails = malloc(sizeof(char)*40);
可以写成
char * listofdetails = malloc(40);
(sizeof(char)
定义为1)。你仍然不应该在代码中直接使用幻数作为40但是使用恰当命名的常量
#define STRING_LENGTH 40
该行
listofdetails[1] = "cars";
错误,因为左侧是详细信息列表中的第二个字符位置,并且您尝试为其分配字符串字符。使用
strcpy(listofdetails, "cars");
和行中的同样问题
printf("%s \n", listofdetails[1]);
使用
printf("%s \n", listofdetails);
代替。
答案 2 :(得分:0)
您正在为单个字节位置分配字符串。
listofdetails[1] = "cars"; // Problem
其中listofdetails[1]
表示字符数组中的单个字符。
您不应该像上面那样分配字符串。使用strcpy
-
strcpy(listofdetails,"cars");
否则你也可以像这样分配
char *listofdetails = "cars";
它不需要内存分配。
尝试以下更改 -
void readFile()
{
char * listofdetails;
listofdetails = malloc(sizeof(char)*40);
strcpy(listofdetails,"cars");
printf("%s \n", listofdetails);
free(listofdetails);
}
也使用string.h
和stdlib.h
标题文件。
答案 3 :(得分:0)
listofdetails[1]
是char(或int)类型。 %s
需要char *
类型。修复:
printf("%s \n", listofdetails);
如果您要打印listofdetails[1]
,请使用%c
:
printf("%c \n", listofdetails[1]);
listofdetails[1] = "cars";
尝试将char
数组分配给char(或int)。
相反,您可以这样做:
listofdetails = malloc(sizeof(char)*40);
strcpy(listofdetails, "cars");
答案 4 :(得分:0)
您似乎想要一个字符串的列表,但您声明listofdetails
只是单个字符串。
相反,您需要添加另一个指针,如下所示:
char **listofdetails = malloc(sizeof(char *) * 40);
现在您可以根据需要使用listofdetails
。但请注意,在C中,数组索引从0开始,而不是1.因此,您可能希望使用listofdetails[0] = "cars";
来设置数组的第一个元素。
答案 5 :(得分:0)
char
是单个字符(例如'a')
char*
是一个指针。在您的情况下,您分配40(单个)字符(malloc)并将第一个地址分配给listofdetails
。正如Alter Mann所写,使用strcpy
将字符串文字或任何以空值终止的字符序列复制到listofdetails
。完成Alter Mann的例子:
char * listofdetails;
listofdetails = malloc(sizeof(char)*40);
strcpy(listofdetails, "cars"); // make sure that the string on the right does not exceed 40 characters!
printf("%s\n", listofdetails); // will print "cars" on a single line
free(listofdetails);
字符串数组的示例:
char ** listofdetails;
listofdetails = malloc(sizeof(char*) * ARRAYSIZE);
listofdetails[0] = malloc(sizeof(char) * STRBUFFERSIZE);
strcpy(listofdetails[0], "cars");
printf("%s\n", listofdetails[0]);
free(listofdetails[0]); // delete string
free(listofdetails); // delete string-array
答案 6 :(得分:0)
assignment4.c:42:19:警告:赋值在没有强制转换的情况下从指针生成整数[默认启用]
来自
行listofdetails[1] = "cars";
listofdetails
是char *
类型的表达式; listofdetails[1]
是类型char
的表达式,它是一个整数类型,它的计算结果是listofdetails
指向的数组的第二个元素。 "cars"
是类型char *
的表达式(稍后会详细介绍),并且您无法在没有强制转换的情况下将指针值分配给整数。
这归结为listofdetails
应存储的内容。是否存储单个字符串?如果是这样,那么你需要写
strcpy( listofdetails, "cars" );
为了将字符串文字"cars"
的内容复制到内存listofdetails
指向。
如果它应该将指针存储到现有字符串或字符串文字中,那么您将完全跳过malloc
步骤并简单地写
char *listofdetails = "cars";
字符串文字"cars"
存储为char
的5元素数组,以便在程序启动时分配,并在程序退出时释放。除非数组表达式是一元&
或sizeof
运算符的操作数,否则数组表达式将被转换(&#34;衰减&#34;)到指针表达式,或者是用于初始化的字符串文字声明中的另一个数组。
在上述情况中,"cars"
不是sizeof
或一元&
运算符的操作数,并且它不能用于初始化 {<1>}的数组,因此它衰减到char
,其值是字符串中第一个字符的地址。因此,到此时,char *
指向字符串文字listofdetails
。
如果它应该存储指向字符串的指针列表,那么您需要执行以下操作:
"cars"
这将分配足够的内存来存储40个指针char **listofdetails = malloc( sizeof *listofdetails * 40 ); // note extra level of indirection
;由于char
的类型为listofdetails
,char **
的类型将为listofdetails[1]
,因此以下行将按您的意图运行:
char *
进行最后一次更改将会修复
assignment4.c:44:2:警告:格式'%s'需要'char *'类型的参数,但参数2的类型为'int'[-Wformat]
抱怨
listofdetails[1] = "cars";
printf("%s \n", listofdetails[i] );
因为当前正在编写,printf("%s \n", listofdetails[1] );
的类型为listofdetails[1]
,由于char
是一个可变函数,因此会提升为int
,printf
需要相应的具有类型%s
的参数。
还有一件事;在C中,数组是0源,因此您使用索引char *
来访问列表的第一个元素,并使用索引0
来访问最后一个元素。