Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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_String_Function - Fatal编程技术网

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