簡體   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