繁体   English   中英

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

[英]public char * member of a class/struct inaccessible?!?!?!po

遵循的代码段。

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

我一直认为拥有struct / class的char *成员没有什么大不了,也没有什么特别的(除了是指向char的指针外,这要求在使用之前先对其进行初始化,然后在某些时候销毁) )。

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

我希望将要运行此代码的人会收到有关拒绝访问某个内存位置的运行时错误。

我还希望当我创建一个char * mystr时,稍后再说mystr =“”; 初始化为mystr使用的内存。

我也想以为我不是白痴,但是当我尝试使用locals窗口来确定某个变量的精确内存地址时,我似乎无法告诉我内存在哪里在。 我要在内存窗口中幸运。 那好吧。

救命! 提前致谢。 我讨厌处理这些愚蠢的char * cuz,我总是以某种方式弄乱它们,而我对它们如何工作的假设也有缺陷。 我要更改此设置,以便我像使用工具一样命令他们,而不是让他们感到沮丧。

再次感谢您的考虑。 乔希

#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 =某物有什么不同,后者是地址不能更改的指针,而前者是指向不能更改的内存的指针?)。 无论哪种方式,这都可以解释我收到的错误消息。 谢谢大家。

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

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

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

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

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

问题是,当您尝试执行以下操作时:

strncpy(work.C, "something", strlen(something));

您正在复制只读数据-这不是一个好主意。 这是因为指针C指向字符串文字; 不允许覆盖字符串文字。 类似的注释也适用于B-但您也会泄漏内存。

关键是您对“运行时”而不是“编译时”错误的评论。 这并不是说该成员不可访问。 初始化后,它只是不可滥用的。

错误在该行中:

C = "test";

在mystruct的构造函数中。 "test"是指向只读内存的指针,使用它初始化非const指针并不安全。 编译器不执行此操作的唯一原因是,在人们关注const正确性之前创建了大量的C代码,应该将其声明为const但实际上并不是。

B = "";

同样不是类型安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM