因此,我试图避免为此使用字符串。我基本上是想制作一个字符串数组。
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很好用,但是太麻烦了
答案 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 ++,则应该使用const
和std::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";
那是编译器不喜欢的。