無料の2Dアレイ。静的ポインタ -- c フィールド と memory-management フィールド と access-violation フィールド 関連 問題

Free 2d array. Static pointer












1
vote

問題

日本語

静的ポインタ

<事前> <コード> static int **2dArr;

で、2D配列にメモリを割り当てます。 どのようにしてそのメモリを解放して別の配列と交換することができますか?

<事前> <コード> ////////////////////////////////////////////////////////////////////////// void func(int **arr) { int i,j,k,tmp; int **destMatrix = NULL; destMatrix = (int**) malloc(N * sizeof(int *)); if ((destMatrix == NULL)) { fprintf(stderr, "out of memory "); exit(2); } for (i = 0; i < N; i++) { destMatrix[i] = (int*) malloc(N * sizeof(int)); if (destMatrix[i] == NULL) { fprintf(stderr, "out of memory "); exit(2); } } for(i = 0; i < N; ++i) { free(arr[i]); } free(arr); arr = NULL; arr = destMatrix; } ////////////////////////////////////////////////////////////////////////// int main() { 2dArr = (int**) malloc(N * sizeof(int *)); if (2dArr== NULL) { fprintf(stderr, "out of memory "); exit(2); } for (i = 0; i < N; i++) { 2dArr[i] = (int*) malloc(N * sizeof(int)); if (2dArr[i] == NULL) { fprintf(stderr, "out of memory "); exit(2); } } func(2dArr); // try to print new array, access violation }

私は無料のメモリを置き、ポインタを置き換えるようにしてください。しかし、それから私はアクセス違反があります。どのように私は正しくそれをすることができますか?

英語

I have a static pointer

   static int **2dArr; 

and then I allocate memory for 2d array. How can I free that memory and replace it with another array?

   //////////////////////////////////////////////////////////////////////////   void func(int **arr) {     int i,j,k,tmp;     int **destMatrix = NULL; destMatrix = (int**) malloc(N * sizeof(int *));  if ((destMatrix == NULL)) {     fprintf(stderr, "out of memory ");     exit(2); }  for (i = 0; i < N; i++) {     destMatrix[i] = (int*) malloc(N * sizeof(int));      if (destMatrix[i] == NULL) {         fprintf(stderr, "out of memory ");         exit(2);     } }    for(i = 0; i < N; ++i) {     free(arr[i]); } free(arr); arr = NULL; arr = destMatrix;  }   //////////////////////////////////////////////////////////////////////////   int main() {    2dArr = (int**) malloc(N * sizeof(int *));    if (2dArr== NULL) {     fprintf(stderr, "out of memory ");     exit(2);      }   for (i = 0; i < N; i++) {     2dArr[i] = (int*) malloc(N * sizeof(int));      if (2dArr[i] == NULL) {             fprintf(stderr, "out of memory ");             exit(2);     } }     func(2dArr);     // try to print new array, access violation  } 

I free memory and try to replace the pointer. But then I have a access violation. How can I do it correctly?

</div
        
   
   

回答リスト

3
 
vote
vote
ベストアンサー
 

カップルのもの:

  • あなたはFUNCに参照によって引数を渡す必要があります: <コード> void func(int ***arr) {
  • そして、あなたは物事を解放する方法を変更します。 <コード> free((*arr)[i]); と <コード> free(*arr);
  • そして最後に、あなたがARR再割り当て方法を変更します: <コード> *arr = destMatrix;
  • また、数字で始まる変数に名前を付けていない - それは動作しません。
  • 。 以下のコメントを参照してください。これは実際には問題ではない(また、あなたの代わりにi++ のFUNCの終わりのforループでのの<コード> ++i を持っていました) LI>

私は Valgrindの<を使用してこれらの問題をデバッグ/>、それをチェックアウトします。

ワーキング・コードは以下の通りです:

<事前> <コード> #include <stdio.h> #include <stdlib.h> #define N 10 ////////////////////////////////////////////////////////////////////////// void func(int ***arr) { int **destMatrix = NULL; destMatrix = malloc(N * sizeof(int *)); if ((destMatrix == NULL)) { fprintf(stderr, "out of memory "); exit(2); } int i; for (i = 0; i < N; i++) { destMatrix[i] = malloc(N * sizeof(int)); if (destMatrix[i] == NULL) { fprintf(stderr, "out of memory "); exit(2); } } for(i = 0; i < N; i++) { free((*arr)[i]); } free(*arr); *arr = destMatrix; } ////////////////////////////////////////////////////////////////////////// int main() { int **tdArr = malloc(N * sizeof(int *)); if (tdArr== NULL) { fprintf(stderr, "out of memory "); exit(2); } int i; for (i = 0; i < N; i++) { tdArr[i] = malloc(N * sizeof(int)); if (tdArr[i] == NULL) { fprintf(stderr, "out of memory "); exit(2); } } func(&tdArr); // try to print new array, does not get access violation //assign numbers 0-99 int j; for (i=0; i<N; i++){ for (j=0; j<N; j++){ tdArr[i][j] = i*10+j; } } //print numbers for (i=0; i<N; i++){ for (j=0; j<N; j++){ printf("%d ", tdArr[i][j]); } } //free internal arrays for (i=0; i<N; i++){ free(tdArr[i]); } //free outer array free(tdArr); return 0; }
 

Couple things:

  • You need to pass the argument by reference in func: void func(int ***arr) {
  • Then change the way you free things: free((*arr)[i]); and free(*arr);
  • and finally change how you reassign arr: *arr = destMatrix;
  • also, don't name variables starting with a number -- it doesn't work.
  • (also, you had ++i instead of i++ at the for loop at the end of func ) this doesn't actually matter -- see the comment below

I debugged these issues using Valgrind, check it out.

Working code is below:

#include <stdio.h> #include <stdlib.h>  #define N 10  ////////////////////////////////////////////////////////////////////////// void func(int ***arr) {   int **destMatrix = NULL;   destMatrix = malloc(N * sizeof(int *));    if ((destMatrix == NULL)) {     fprintf(stderr, "out of memory ");     exit(2);   }    int i;   for (i = 0; i < N; i++) {     destMatrix[i] = malloc(N * sizeof(int));      if (destMatrix[i] == NULL) {       fprintf(stderr, "out of memory ");       exit(2);     }   }    for(i = 0; i < N; i++) {     free((*arr)[i]);   }   free(*arr);   *arr = destMatrix;  } ////////////////////////////////////////////////////////////////////////// int main() {   int **tdArr = malloc(N * sizeof(int *));   if (tdArr== NULL) {     fprintf(stderr, "out of memory ");     exit(2);   }    int i;   for (i = 0; i < N; i++) {     tdArr[i] = malloc(N * sizeof(int));      if (tdArr[i] == NULL) {       fprintf(stderr, "out of memory ");       exit(2);     }   }    func(&tdArr);   // try to print new array, does not get access violation    //assign numbers 0-99   int j;   for (i=0; i<N; i++){     for (j=0; j<N; j++){       tdArr[i][j] = i*10+j;     }   }   //print numbers   for (i=0; i<N; i++){     for (j=0; j<N; j++){       printf("%d ", tdArr[i][j]);     }   }    //free internal arrays   for (i=0; i<N; i++){     free(tdArr[i]);   }   //free outer array   free(tdArr);    return 0; } 
</div
 
 
     
     
3
 
vote

私はあなたがここで何をしようとして全くわからないんだけど、声明

ということを覚えておいてください <事前> <コード> arr = destMatrix; <コード> func の中にのみの destMatrix のへのポインタのローカルコピーを設定します。戻る<コード>でfree((*arr)[i]);0 の(およびグローバル)、<コード> free((*arr)[i]);1 の(または任意の@nmが述べたように、これは有効な識別子ではありませんので、あなたが実際に、それを呼び出した)まだ元のを持っている<コード> free((*arr)[i]);2 のED値は、<コード> free((*arr)[i]);3 の中のポインタの全てを首尾よく解放されたにも関わらず。あなたが使用したり、そのポインタ(または古いポインタそれはまだ[そう]ポイント)を解放しようとする他の場所で、あなたは、さまざまなエラーを得ることができます。 (この場合は、あなたがエラーを取得している幸せになる - 。あなたの代わりに黙って他のいくつかのプロセスが依存しているメモリを破壊することができる)あなたが変更する場合は、<コード> free((*arr)[i]);4 の<コード> free((*arr)[i]);5 、あなたが宣言する必要があります。 <事前> <コード> #include <stdio.h> #include <stdlib.h> #define N 10 ////////////////////////////////////////////////////////////////////////// void func(int ***arr) { int **destMatrix = NULL; destMatrix = malloc(N * sizeof(int *)); if ((destMatrix == NULL)) { fprintf(stderr, "out of memory "); exit(2); } int i; for (i = 0; i < N; i++) { destMatrix[i] = malloc(N * sizeof(int)); if (destMatrix[i] == NULL) { fprintf(stderr, "out of memory "); exit(2); } } for(i = 0; i < N; i++) { free((*arr)[i]); } free(*arr); *arr = destMatrix; } ////////////////////////////////////////////////////////////////////////// int main() { int **tdArr = malloc(N * sizeof(int *)); if (tdArr== NULL) { fprintf(stderr, "out of memory "); exit(2); } int i; for (i = 0; i < N; i++) { tdArr[i] = malloc(N * sizeof(int)); if (tdArr[i] == NULL) { fprintf(stderr, "out of memory "); exit(2); } } func(&tdArr); // try to print new array, does not get access violation //assign numbers 0-99 int j; for (i=0; i<N; i++){ for (j=0; j<N; j++){ tdArr[i][j] = i*10+j; } } //print numbers for (i=0; i<N; i++){ for (j=0; j<N; j++){ printf("%d ", tdArr[i][j]); } } //free internal arrays for (i=0; i<N; i++){ free(tdArr[i]); } //free outer array free(tdArr); return 0; } 16

で呼んでください <事前> <コード> free((*arr)[i]);7

あなたは例えば、逆参照を経由して元の値にアクセスして変更することができます。

<事前> <コード> free((*arr)[i]);8
 

I'm not entirely sure what you're trying to do here, but keep in mind that the statement

arr = destMatrix; 

in func only sets the local copy of your pointer to destMatrix. Back in main (and globally), 2dArr (or whatever you actually called it, since as @n.m. noted this isn't a valid identifier) still has its original malloced value even though you've successfully freed all of the pointers in func. If you try to use or free that pointer (or the old pointers it still [likely] points to) elsewhere then you could get various errors. (In this case, be happy you're getting errors -- you could instead be silently destroying memory that some other process is depending on.) If you intend to change 2dArr in func, you need to declare

void func(int ***arr); 

and call it with

func(&2dArr); 

so that you can access and change the original values via dereferencing, e.g.

free((*arr)[i]); 
</div
 
 
1
 
vote

での free((*arr)[i]);9 を使用すると、静的のVARのためにメモリを解放<コード> free(*arr);0 は、あなたが、<コード> free(*arr);1 はそれを設定するつもりが、あなただけあるように見えます<コード> free(*arr);2 に入力ポインタ変数のコピーを設定します。

は、<コード> free(*arr);3 は、あなたが設定することができます。<コード> free(*arr);4 が、これは参照代わりの値によって** int型を渡してます。

に変更した場合
 

In func you free the memory for the static var 2darr and it looks like you intend to set it to destMatrix but you are only setting a copy of the input pointer variable to func.

If you change to void func(int **& arr), then you can set 2darr, this is passing the int** by reference instead of value.

</div
 
 

関連する質問

0  資格情報の配列  ( Array of credentials ) 
信任状プロバイダと資格情報を開発しています。だから私はこのクラスを持っています SampleProvider と SampleCredential を持っています。 SampleProvider に宣言すると、宣言で SetUsageScenario()2 ...

-4  ARRAY> 130046要素を削除するときのC ++アクセス違反  ( C access violation when deleting array 130046 elements ) 
私は非常に奇妙な問題を抱えています。以下は、それを再現するコードの最小ビットです。 <事前> <コード> int main(void) { class MyClass { public: int* ptr; MyClass(int i) ...

1  'emgu.cv.mat`に `emgu.cv.ui.imagebox`(EMGU)に割り当てながら' System.AccessViolationException '  ( System accessviolationexception while assigning emgu cv mat to emgu cv ui i ) 
こんにちは私がしようとしていることは、 Emgu.CV.Mat に bad_boy0 に割り当てることですが、<コード内の bad_boy1 エラーが発生し続けています。 > bad_boy2 ファイル(行2379 <コード> df['Right Addres...

0  なぜ私のアプリはvs2005ランタイムをインストールしない限り、なぜXPにクラッシュしますか?  ( Why my app crashes on win xp unless i install vs2005 runtime ) 
私のアプリは、vc 2008で書かれたなぜ私のアプリは bare windows XPで描かれているのかをC0000005としています。それは任意のWindows Vistaと7のうちにうまく機能します。XPでは、追加情報なしでクラッシュするでしょう。以下は...

3  次回の実行時にデバッガまたはアプリクラッシュの各実行後にC ++ Builder XE3を再起動する必要があります。  ( Cbuilder xe3 needs to be restarted after each run in the debugger or app crash ) 
これは奇妙なことであり、私はこれをWindows 7で見ているように思われる(私がWindows 8でアプリを構築するとき、これは起こっているようです)。これはXE3を介してC ++ Builder XEで表示されます。アプリをコンパイルし(パッケージとRTL...

6  SQL CompactはaccessViolationExceptionをランダムに生成します  ( Sql compact randomly produces accessviolationexception ) 
マルチスレッドアプリケーションでSQL Server Compact Edition 3.5.1.0 SP1を実行しています。アプリケーションは、トランザクション内の挿入クエリをランダムに実行します。短いトランザクションでは、それはうまく機能します。しかし、ト...

2  OpenCV 2.4.2 + Visual Studio 2012 + Windows 7(64ビット)の顔検出サンプル  ( Face detection sample with opencv 2 4 2 visual studio 2012 windows 7 64 bit ) 
ビデオの顔検出のためにOpenCVのサンプルフォルダから次のコードを使用しています: <事前> <コード> #include "stdafx.h" #include "opencv2/objdetect/objdetect.hpp" #include "ope...

0  アクセス違反DirectWrite  ( Access violation directwrite ) 
DirectWrite APIを使用しています。私は自分のレイアウトとテキストレンダリングエンジンを実装しています。 IDWriteTextLayout オブジェクトを正常に作成しています。次の電話をかけると、アクセス違反エラーが発生し、その理由がわからな...

39  保護されたメモリを読み書きしようとしました  ( Attempted to read or write protected memory ) 
私のアプリケーションにいくつかの異なるスポットを投げ込まれているAccessViolationExceptionを見始めました。私たちのテストサーバー、私の開発PCには発生しませんでした。それはまた私達の2つのプロダクションサーバーのうちの1つにそれ自身を明示...

0  DLLインジェクションで命令を上書きしようとするとDelphi - アクセス違反  ( Delphi access violation when try to overwrite an instruction with dll injectio ) 
おはようございます。 私はDLL注射について学びようとしているので、文字列を取得し、strcmp()と比較して、入力が「勝者」と比較して、ソフトウェアは良い男の子メッセージを提供します。 Learn DLL注入のPorpouse。 そのため、挿入時にフォームを...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有