C 如何正确初始化字符串
如何为下面的函数定义下面的字符串 到目前为止,我收到了警告:C 如何正确初始化字符串,c,string,function,C,String,Function,如何为下面的函数定义下面的字符串 到目前为止,我收到了警告: C4047:“=”:“const char”与“char[4]”的间接寻址级别不同。 错误是: C2166:l值指定常量对象。 在下面代码的第三行中: uint8_t *buffer= (uint8_t *) malloc(sizeof(uint32_t)); const char *stringaling= (const char *) malloc(sizeof(uint32_t)); *stringaling = "fun";
C4047:“=”:“const char”与“char[4]”的间接寻址级别不同。
错误是:
C2166:l值指定常量对象。
在下面代码的第三行中:
uint8_t *buffer= (uint8_t *) malloc(sizeof(uint32_t));
const char *stringaling= (const char *) malloc(sizeof(uint32_t));
*stringaling = "fun";
newval = protobuf_writeString (buffer, stringaling);
uint32_t protobuf_writeString(uint8_t *out,const char * str)
{
if (str == NULL)
{
out[0] = 0;
return 1;
}
else
{
size_t len = strlen (str);
size_t rv = uint32_pack (len, out);
memcpy (out + rv, str, len);
return rv + len;
}
}
如果您确实想初始化
char*
,可以编写以下代码:
const char*stringaling=“fun”代码>
下面是。如果您确实想初始化char*
,您可以编写以下代码:
const char*stringaling=“fun”代码>
这是我的
这是无效的代码。您试图分配给常量变量,这是非法的。然后,您尝试将字符数组分配给一个字符。最后,即使有一个大小合适的非常量字符数组,也不能分配数组,因为它们不是一级值
这是无效的代码。您试图分配给常量变量,这是非法的。然后,您尝试将字符数组分配给一个字符。最后,即使有大小合适的非常量字符数组,也无法分配数组,因为它们不是一级值。尝试使用
char *stringaling = malloc(sizeof(uint32_t));
strcpy(stringaling, "fun");
…取而代之,看看这样做是否效果更好。然而,请注意,(至少通常)sizeof(uint32\u t)
恰好是容纳“乐趣”的合适尺寸,这是非常偶然的。你通常不想那样做
或者,您可能需要:
char const *stringaling = "fun";
或:
不过,您的任务是行不通的——C对语言中内置的字符串只有最起码的支持;大多数操作(包括复制字符串)通常通过库函数完成,例如strcpy
尝试使用
char *stringaling = malloc(sizeof(uint32_t));
strcpy(stringaling, "fun");
…取而代之,看看这样做是否效果更好。然而,请注意,(至少通常)sizeof(uint32\u t)
恰好是容纳“乐趣”的合适尺寸,这是非常偶然的。你通常不想那样做
或者,您可能需要:
char const *stringaling = "fun";
或:
不过,您的任务是行不通的——C对语言中内置的字符串只有最起码的支持;大多数操作(包括复制字符串)通常是通过库函数完成的,例如strcpy
“fun”
是字符串文本,本质上是常量字符*
stringling
也是一个const char*
,因此您的第三行正在尝试将const char*
分配给一个const char
,它不会飞行
如果是常量字符串,您可以执行以下操作:
const char *stringaling = "fun";
如果输入字符串是动态的,则可以执行以下操作:
char *stringaling= (char *) malloc(strlen(inputString)+1);
strcpy(stringaling, inputString);
显然,如果你对它进行malloc,你需要释放它,或者感受内存泄漏的愤怒。“fun”
是一个字符串文本,本质上是一个常量字符*
stringling
也是一个const char*
,因此您的第三行正在尝试将const char*
分配给一个const char
,它不会飞行
如果是常量字符串,您可以执行以下操作:
const char *stringaling = "fun";
如果输入字符串是动态的,则可以执行以下操作:
char *stringaling= (char *) malloc(strlen(inputString)+1);
strcpy(stringaling, inputString);
显然,如果你对它进行malloc,你需要释放它,或者感受到内存泄漏的愤怒。没有所有你也可以使用的东西:
newval = protobuf_writeString (buffer, "fun" );
没有所有你也可以使用的东西:
newval = protobuf_writeString (buffer, "fun" );
第一个问题:
const char *stringaling= (const char *) malloc(sizeof(uint32_t));
这方面有几个问题
首先,您不想将stringling
声明为constchar*
;您将无法修改stringling
指向的任何内容(当然,*stringling
将不可写)。这很重要,因为您希望将另一个字符串的内容复制到stringaling
所指向的位置。删除const
关键字
其次,malloc(sizeof(uint32_t))
恰好为这个特定字符串分配了足够的字节(4),但不清楚您是否打算分配4个字节。当为数组(字符串是数组)分配内存时,显式指示要分配的元素数
最后,在C中,强制转换malloc
的结果被认为是不好的做法。如果您忘记包含stdlib.h,或者在范围内没有malloc
的原型,则强制转换将抑制有用的诊断消息。从1989年的标准开始,malloc
返回void*
,可以将其分配给任何其他对象指针类型,而无需强制转换。在C++中,这是不正确的,所以在那里需要一个强制转换,但是如果你正在编写C++,你就应该使用<代码>新的< /代码>来代替<代码> MalOC/。p>
所以,把这行改为
char *stringaling = malloc(LEN); // or malloc(LEN * sizeof *stringaling), but
// in this case that's redundant since
// sizeof (char) == 1
其中LEN是要分配的字符数
malloc
调用的一般形式是
T *p = malloc (N * sizeof *p);
其中,T
是基本类型(int
,char
,float
,struct…
,等等),而N
是要分配的类型T的元素数。由于表达式*p
的类型是T
,sizeof*p
==sizeof(T)
;如果更改p
的类型,则不必在malloc
调用本身中复制该更改
第二个问题:
*stringaling = "fun";
同样,有几个问题在起作用。首先,不能使用=
运算符指定字符串值。字符串文字是数组表达式,在大多数上下文中,数组表达式将其类型从“T的N元素数组”隐式转换为“指向T的指针”。您不需要复制字符串文字的内容,而只需将指针指定给字符串中的第一个字符
这将“工作”(见下文),除了
strcpy(stringaling, "one");
const char *stringaling = "fun";