c++ - public char * 类/结构的成员无法访问?!?!?!po

标签 c++ char member

要遵循的代码片段。

我有一个结构(示例代码有类,都试过了,效果相同),它将存储一些 char *。我为类创建了一个构造函数,将它们中的大部分初始化为 = ""; 在尝试修改该类实例的该成员时,strncpy et all 报告访问被拒绝。当我在内部结构/类成员函数的范围内使用这些函数时,它们甚至会报告访问被拒绝。

我的假设是拥有一个结构/类的 char * 成员没什么大不了的,也没什么特别的(除了是一个指向 char 的指针,这要求它在使用之前的某个时刻被初始化,并被销毁在某些时候)。

如果有人能告诉我我的假设哪里错了,并指导我阅读一些可以阐明正在发生的事情的文献,我将不胜感激。我目前正在vs2008完整版下编译代码。

我希望运行此代码的人会收到有关被拒绝访问特定内存位置的运行时错误。

我还希望当我创建一个 char * mystr 时,当我稍后说 mystr = ""; 时内存已为 mystr 初始化,然后可以使用。

我也想认为我不是白痴,但是当我尝试使用本地窗口来确定某个变量的精确内存地址时,我似乎无法让 ide 告诉我内存在哪里。我必须在内存窗口中走运。哦好吧。

救命啊!提前致谢。我讨厌和这些愚蠢的 char * 打交道,因为我总是以某种方式搞砸它们,而且我对它们如何工作的假设是有缺陷的。我想改变这一点,以便我像使用工具一样命令它们,而不是它们让我感到沮丧。

再次感谢您的考虑。 乔希

#include <stdio.h>
#include <string.h>



   class mystruct {
    public:
 int A;
 char* B;
 char* C;

 mystruct() {
  A = 0xFE;
  B = new char[32];
  B = "";
  C = "test";
 }

 void test(char *input) {
  strncpy(B,input, strlen(input));
 }
    };

    int main(char* argv[], int argc) {

 mystruct work;
 char wtf[32];

    // work.A = 0xbb;
 work.test("gotchabitch!");
    // sprintf(wtf, "address of work is %x" , &work);
    // strncpy(work.C,"gotchabitch!\0",strlen("gotchabitch!\0"));
  strncpy(work.B,"gotchabitch!",strlen("gotchabitch!"));
 printf("%d;%s;%s;", work.A, work.B, work.C); 

 return 0;
    } 

对所有人的回应:好的,我了解到当您将字符串文字分配给 char * 时,您实际上是在说 char * const B = "something"。 (这与 const char * B = something 有什么不同,后者是一个地址不能改变的指针,而前者是一个指向不能改变的内存的指针?)。无论哪种方式,这都解释了我收到的错误消息。谢谢大家。

最佳答案

B = new char[32];
B = "";

首先将 new 返回的指针赋给 B,然后将指向字符串文字 "" 的指针赋给 B,有效覆盖new返回的指针。

As Jonathan Leffler explains ,字符串文字是只读的,因此当您尝试写入 B 指向的字符串文字 ("") 时会遇到错误。

如果你想在B中存储空字符串,你需要使用像strcpy()这样的库函数(或者更安全的函数,像 >snprintf()).在这种情况下,您也可以将 \0 分配给 B[0],因为它们是同一回事。在 C 和 C++ 中,您不能使用 = 分配数组(或 C 字符串,它们只是字符数组)。

理想情况下,您应该只使用 std::string 而不是原始的 C 字符串;那么你就不用担心这种事情了。

关于c++ - public char * 类/结构的成员无法访问?!?!?!po,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3221397/

相关文章:

c++ - 使用 cuda 从 RGBA 图像中分离 channel (无法显示完整图像)

C:从链表中检索 char 值

c++ - 空格后的字符不会被打印出来

c - 如何比较指针和整数?

c++ 11 - 将成员函数传递给线程给出 : no overloaded function takes 2 arguments

Oracle 向一个对象类型添加一个新的成员函数/过程

C++ 约定——类的源文件和头文件

c++ - std::__gcd 和 std::gcd 有什么区别?

java - 这是一个什么样的Java成员变量?

C++ 重载 << 用作流的类对象的运算符