C - mallocing字符串时出错

时间:2014-08-14 13:52:14

标签: c malloc

当我尝试编译下面的代码时,我不断收到以下错误。我在网上搜索了错误的含义,但似乎没有任何东西适合我的代码。请有人告诉我在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);
}

7 个答案:

答案 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.hstdlib.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";

listofdetailschar *类型的表达式; 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的类型为listofdetailschar **的类型将为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是一个可变函数,因此会提升为intprintf需要相应的具有类型%s的参数。

还有一件事;在C中,数组是0源,因此您使用索引char *来访问列表的第一个元素,并使用索引0来访问最后一个元素。