Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_Malloc - Fatal编程技术网

C++ 类型为“的值”*常量字符*”;无法分配给类型为“的实体”;字符*”;

C++ 类型为“的值”*常量字符*”;无法分配给类型为“的实体”;字符*”;,c++,string,malloc,C++,String,Malloc,所以我尽量避免使用字符串。我基本上是在尝试创建一个字符串数组 char **hourtimes = (char**)malloc(100 * sizeof(char*)); for (int i = 0; i < 100; i++) { (*hourtimes) = (char*)malloc((100 * sizeof(char))); } char**hourtimes=(char**)malloc(100*sizeof(char*); 对于(int

所以我尽量避免使用字符串。我基本上是在尝试创建一个字符串数组

char **hourtimes = (char**)malloc(100 * sizeof(char*));

    for (int i = 0; i < 100; i++) {
        (*hourtimes) = (char*)malloc((100 * sizeof(char)));
    }
char**hourtimes=(char**)malloc(100*sizeof(char*);
对于(int i=0;i<100;i++){
(*hourtimes)=(char*)malloc((100*sizeof(char)));
}
我在这里制作了一个字符串数组

现在,我想让
小时[0]=“十二”

我试过做
*hourtimes=“十二”

但我得到了同样的错误,我认为这在c中是有效的,但我使用的是c++

hourtimes[0][0]='t'
hourtimes[0][1]=“w”


etc工作正常,但这太麻烦了。这是一个字符串文本,可以用作指向常量字符的指针,但不能用作指向非常量字符的指针

"twelve"
hourtimes[0] = "twelve";
但是,您确实尝试将其分配给指向非常量字符的指针

"twelve"
hourtimes[0] = "twelve";

这是编译器不喜欢的。

这是一个字符串文本,可以用作指向常量
字符的指针,但不能用作指向非常量字符的指针

"twelve"
hourtimes[0] = "twelve";
但是,您确实尝试将其分配给指向非常量字符的指针

"twelve"
hourtimes[0] = "twelve";
这是编译器不喜欢的。

*hourtimes=“十二”
正在将
*hourtimes
设置为指向只读内存中的字符串。然后,您将尝试修改存储在该只读内存中的数据。你要做的是把“十二”复制成*小时

strcpy(hourtimes[0],"twelve");

<强>注释:< /强>此回答是在问题被标记时,C.C++将有不同的首选方式来执行这种事情。

<代码> *小时时=“十二”< /C> >设置<代码> *小时/ <代码>指向只读存储器中的字符串。然后,您将尝试修改存储在该只读内存中的数据。你要做的是把“十二”复制成*小时

strcpy(hourtimes[0],"twelve");

<强>注释:<强>此答案是在问题被标记的时候编写的。C++将有不同的首选方式来执行这种事情。

< P>错误消息告诉你到底出了什么问题:不能将<代码> const char */Cube >分配给<代码> char */COD>。那是什么意思

const char*
char*
都是类型。事实上,它们几乎是同一类型;一个是指向字符的指针,另一个是指向常量字符的指针。这意味着后者无法改变1;毕竟,这就是“常数”的含义。因此,当您试图告诉编译器将指向常量类型的指针视为指向非
const
类型的指针时,它会给您一个错误,因为否则它无法保证字符串不会被修改

“whatever”
始终是一个
常量字符*
,而不是
字符*
,因为它存储在内存中,通常不需要修改,如果编译器可以安全地假设它是不变的(这是因为它是
常量,所以它可以)

<>我不会告诉你如何正确地写你要写的代码,因为如果你使用C++,你应该使用<代码> STD::vector < /COD>和<代码> STD::String < /C> >而不是任何有指针的东西,只要可能,这里可能包括。无论出于何种原因,如果您需要使用指针,那么注释已经充分涵盖了这一点



1:好的,是的,它可以——但这超出了这个答案的范围,我不想让任何初学者感到困惑。

错误消息告诉您确切的错误:您不能将
常量字符*
分配给
字符*
。那是什么意思

const char*
char*
都是类型。事实上,它们几乎是同一类型;一个是指向字符的指针,另一个是指向常量字符的指针。这意味着后者无法改变1;毕竟,这就是“常数”的含义。因此,当您试图告诉编译器将指向常量类型的指针视为指向非
const
类型的指针时,它会给您一个错误,因为否则它无法保证字符串不会被修改

“whatever”
始终是一个
常量字符*
,而不是
字符*
,因为它存储在内存中,通常不需要修改,如果编译器可以安全地假设它是不变的(这是因为它是
常量,所以它可以)

<>我不会告诉你如何正确地写你要写的代码,因为如果你使用C++,你应该使用<代码> STD::vector < /COD>和<代码> STD::String < /C> >而不是任何有指针的东西,只要可能,这里可能包括。无论出于何种原因,如果您需要使用指针,那么注释已经充分涵盖了这一点



1:好的,是的,它可以——但这超出了这个答案的范围,我不想让任何初学者感到困惑。

在分配循环中,
(*hourtimes)
hourtimes[0]
相同,因此在每次循环迭代中,您都将分配的子数组分配到主数组中的同一个插槽,导致内存泄漏和插槽未初始化。您需要改用
hourtimes[i]

char **hourtimes = (char**)malloc(100 * sizeof(char*));

for (int i = 0; i < 100; i++) {
    hourtimes[i] = (char*)malloc(100 * sizeof(char));
}
#include <string>
#include <vector>

std::vector<std::string> hourtimes(100);
...
hourtimes[0] = "twelve";
说到这里,这就是C语言处理字符串数组的方法。C++方式是使用<代码> STD::vector < /COD>和 >:

char **hourtimes = (char**)malloc(100 * sizeof(char*));

for (int i = 0; i < 100; i++) {
    hourtimes[i] = (char*)malloc(100 * sizeof(char));
}
#include <string>
#include <vector>

std::vector<std::string> hourtimes(100);
...
hourtimes[0] = "twelve";
#包括
#包括
std::向量时数(100);
...
时间[0]=“十二”;

在分配循环中,
(*hourtimes)
hourtimes[0]
相同,因此在每次循环迭代中,您将分配的子数组分配到主数组中的同一插槽,从而导致内存泄漏和未初始化插槽。您需要改用
hourtimes[i]

char **hourtimes = (char**)malloc(100 * sizeof(char*));

for (int i = 0; i < 100; i++) {
    hourtimes[i] = (char*)malloc(100 * sizeof(char));
}
#include <string>
#include <vector>

std::vector<std::string> hourtimes(100);
...
hourtimes[0] = "twelve";
现在,说了这么多,这就是C的方式