在C中打印动态2D阵列

时间:2015-08-20 12:16:13

标签: c arrays dynamic 2d

我试图在C中打印 AudioManager audioManager = (AudioManager)cordova.getActivity().getSystemService(Context.AUDIO_SERVICE); audioManager.setMode(AudioManager.MODE_IN_CALL); audioManager.setSpeakerphoneOn(true); Intent intent = new Intent(isTelephonyEnabled() ? Intent.ACTION_CALL : Intent.ACTION_VIEW); intent.setData(Uri.parse(number)); cordova.getActivity().startActivity(intent); callbackContext.success(); } catch (Exception e) { callbackContext.error("CouldNotCallPhoneNumber"); } return true; } ,问题是代码在第一次打印时很好,但是如果它再次打印则会丢失底行。 这是我正在使用的代码:

dynamic 2D array

正在制作的游戏是点和框,因此宽度和高度是框的数量,数组实际上分配为void display_board( int height, int width, char** gameBoard ) { int i; char *rowString; rowString = malloc(((width*2)+1) * sizeof( char )); for( i = 0; i < ((height*2) + 1); i++ ){ rowString = *(gameBoard + i); printf("%s\n",rowString); } free(rowString); } height*2+1,并且如果高度为高,则设置为如此width*2+1,宽度为2,请注意该示例已经填充了所有边,但通常边缘只是空格:

4

当我第一次打印时,如果我再次打印它,它看起来像这样:

x-x-x-x-x
| | | | |
x-x-x-x-x
| | | | |
x-x-x-x-x

有关为何发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:1)

在循环之前,您分配内存并将其分配给指针变量rowString。但是在循环内部,重新分配变量以指向其他地方,从而丢失指向已分配内存的原始指针。稍后,当您尝试释放内存时,可以释放&#34; 2d矩阵中的内存&#34;而不是你刚分配的记忆。

所有这些导致未定义的行为,因为您稍后会尝试取消引用之前的免费内存(*(gameBoard + i))。

这里显而易见的解决方案是不重新指定指针,而是复制字符串,例如与strcpy。另一个非常明显的解决方案是根本不分配内存,甚至不使用rowString变量,因为您并不真正需要它,但可以直接在您的{{{{{}}中使用指针*(gameBoard + i) 1}}来电。