因此,我想更好地了解C ++的字符串文字的工作方式。我主要关注的是,您将字符串文字的地址分配给指针并将其传递给了。例如:

char* advice = "Don't stick your hands in the toaster.";

现在可以说,我只是通过在程序期间复制指针来传递此字符串。当然,这可能不是一个好主意,但是我很好奇幕后实际情况。

对于另一个示例,假设我们制作了一个返回字符串文字的函数:

char* foo()
{
    // function does does stuff
    return "Yikes!"; // somebody's feeble attempt at an error message
}

现在说,此功能经常被称为,字符串文字仅与称为一半的时间使用:

// situation #1: it's just randomly called without heed to the return value
foo(); 

// situation #2: the returned string is kept and used for who knows how long
char* retVal = foo();

在第一种情况下,实际发生了什么?字符串是刚刚创建但未使用且从未被划分的?

在第二种情况下,只要用户发现需要它,字符串就必须维护吗?当不再需要它的时候会发生什么...那时该记忆会被释放(假设再也没有指向该空间)?

不要误会我的意思,我不打算使用这样的字符串文字。我打算使用容器来检查我的字符串(可能是STD :: String)。我主要只是想知道这些情况是否会引起内存管理或损坏数据的问题。

有帮助吗?

解决方案

字符串词有类型 const char[N] (在哪里 N 是长度 + 1),并且是静态分配的。您不必担心内存问题;如果您的程序中使用了一个字符串,则全部为您处理,并且位于程序内存中的某个地方(通常只读)。

也就是说,这些是“相同的”:

static const char str[] = "a string";
"a string"

当您指出字符串文字时,您指向数组上的第一个字符。实际上,因为类型是 const char[], ,只能通过 const char*. 。从字符串的转换到 char* 被弃用,不安全。

// the "same"
static const char str[] = "a string";
const char* strPtr = str; // decays

const char* s1 = "a string";
char* s2 = "a string"; // allowed, implicit const_cast

*s1 = 'A'; // not allowed, it's const
*s2 = 'B'; // allowed, it's not const (but leads to undefined behavior)

其他提示

首先,将FOO的返回值声明为const,因为字符串文字是如果不引起可怕的“未定义行为”而无法更改的常数。然后,这将迫使所有使用FOO的返回值也称为const的指针,并可能限制(通常是无意间)所做的损坏。字符串文字存储在二进制可执行文件的“文本”区域中 - 它们在运行时并未像这样创建。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top