无法将类型“ * const char *”的值分配给类型“ char *”的实体

时间:2018-06-22 21:50:52

标签: c++ string malloc

因此,我试图避免为此使用字符串。我基本上是想制作一个字符串数组。

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

    for (int i = 0; i < 100; i++) {
        (*hourtimes) = (char*)malloc((100 * sizeof(char)));
    }

所以我基本上在这里制作了一个字符串数组

现在,我要制作hourtimes[0] = "twelve";

我尝试做*hourtimes = "twelve";

但是我遇到了同样的错误,我认为这可以在c中使用,但是我正在使用c ++

hourtimes[0][0] = 't'; hourtimes[0][1] = 'w';

etc很好用,但是太麻烦了

4 个答案:

答案 0 :(得分:2)

*hourtimes = "twelve"设置*hourtimes指向只读存储器中的字符串。然后,您尝试修改该只读存储器中存储的数据。您要做的是将“十二”复制到* hourtimes中。

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

注意:此答案是在为C标记问题时写的。C++将具有不同的首选方式来进行此类事情。

答案 1 :(得分:2)

该错误消息告诉您确切的问题是:您无法将import SpriteKit import GameplayKit var positionX = CGFloat() var positionY = CGFloat() var newPositionX = CGFloat() var newPositionY = CGFloat() var redDotPosition = CGPoint() var oldPosition = CGPoint() var newPosition = CGPoint() class GameScene: SKScene { var redDot : SKSpriteNode? var entities = [GKEntity]() var graphs = [String : GKGraph]() private var lastUpdateTime : TimeInterval = 0 private var label : SKLabelNode? private var spinnyNode : SKShapeNode? override func sceneDidLoad() { redDot = childNode(withName: "redDot") as? SKSpriteNode redDot?.texture = SKTexture(imageNamed: "redDot") redDot?.position = CGPoint(x: frame.midX , y: frame.midX) } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { for t in touches { self.touchMoved(toPoint: t.location(in: self)) oldPosition = t.previousLocation(in: self) let oldPositionX = oldPosition.x let oldPositionY = oldPosition.y newPositionX = t.location(in: self).x newPositionY = t.location(in: self).y deltaX = newPositionX - oldPositionX deltaY = newPositionY - oldPositionY redDot?.position = CGPoint(x: redDot!.position.x + deltaX , y: redDot!.position.y + deltaY) } } 分配给const char *。那是什么意思?

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

const始终是"whatever",而不是const char *,因为它存储在通常不希望修改的内存中,并且编译器可以使真正整洁地< / em>优化,前提是它可以安全地假定它没有发生变化(因为它是char *,所以可以)。

我不会告诉您如何“正确地”编写所需的代码,因为如果您使用的是C ++,则应该使用conststd::vector而不是任何带有只要有可能,都可以在这里找到指针。如果出于某种原因,您需要使用指针,则注释已经足够涵盖了这一点。


1:是的,它可以-但这不在此答案的范围内,我也不想使任何初学者感到困惑。

答案 2 :(得分: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));
}

使用完数组后,别忘了释放数组:

for (int i = 0; i < 100; i++) {
    free(hourtimes[i]);
}

free(hourtimes);

现在,字符串文字的类型为const char[N],其中N是文字中的字符数,空终止符为+ 1。因此"twelve"将是const char[7]

您的数组仅允许存储char*指针,但是const char[N]会衰减为指向第一个const char*的{​​{1}}指针。您无法将char分配给const char*,从而导致编译器错误。

即使有可能做到(确实如此,但仅使用类型转换),您也不应该这样做,因为这样做会导致内存泄漏,因为您可能会丢失您原来指向已分配数组的指针,更糟糕的是char*仍然无法释放字符串文字。

您真正想要做的是将字符串文字的 content 复制到分配的数组存储中。您可以为此使用free()

strncpy()

现在,尽管如此,这是处理字符串数组的C方法。 C ++的方法是改为使用strncpy(hourtimes[0], "twelve", 100); std::vector

std::string

答案 3 :(得分:0)

这是一个字符串文字,可以用作指向常量char的指针,而不能用作指向非const char的指针。

"twelve"

但是您确实尝试将其分配给指向非常量字符的指针。

hourtimes[0] = "twelve";

那是编译器不喜欢的。