

如圖,設定二維陣列ch,想要洗掉陣列中的某個元素(應該算行吧);想洗掉某個元素后,洗掉位置后的元素全部前移,并釋放最后一行元素的記憶體,我的代碼運行會出現
這種情況,最后的位置顯示為(null),想去掉它,并釋放記憶體,首先希望能有大神教我如何把“(null)”刪掉,釋放記憶體其次,本人學生小白,在這里謝謝各位大神了。代碼如下:
#include<stdio.h>
#include<stdlib.h>
void add(char **ch,int s);
void del(char **ch,int s);
main()
{
char **ch;
int s,l;//設定兩個變數,為陣列長度
printf("請輸入陣列大小:");
scanf("%d",&s);//輸入陣列大小
ch=(char**)malloc(s *sizeof(char));//申請一個長度為s的陣列,用p指向首地址
printf("請輸入陣列中的元素的值:\n");//賦值
for(l=0;l<s;l++)//為陣列的元素賦值
{
ch[l]=(char *)malloc(s *sizeof(char*));
scanf("%s",ch[l]);
getchar();
}
for(l=0;l<s;l++)//輸出陣列中的所有元素
{
printf("%s\t",ch[l]);
}
printf("\n");
add(ch,s);//呼叫add函式
printf("新的陣列:");
for(l=0;l<=s;l++)//輸出新的所有陣列元素
{
printf("%s\t",ch[l]);
}
del(ch,s);//呼叫del函式
printf("洗掉元素后的陣列為:\n");
for(l=0;l<=s;l++)//輸出洗掉后的所有元素
{
printf("%s\t",ch[l]);
}
return 0;
}
void add(char **ch,int s)//add函式,目的是增加某個位置的某個元素
{
int z;
int i;
printf("請輸入要加入的位置:");
scanf("%d",&i);
if(i<=0)
{
printf("非法輸入,請重新輸入");
add(ch,s);
}
for(z=s;z>=i;z--)
{
ch[z]=ch[z-1];
}
ch[i-1]=(char *)malloc(s *sizeof(char*));
printf("請輸入要加入的資料:");
scanf("%s",ch[i-1]);
}
void del(char **ch,int s)//del函式,目的是洗掉某個位置的某個元素
{
int n;//設定變數,為位置序號
int z;
printf("請輸入要洗掉的位置:");
scanf("%d",&n);//輸入位置
for(z=n;z<=s;z++)//將n后的所有元素前移一個位置
{
ch[z-1]=ch[z];
}
ch[s-1]=NULL;//最后一個為空
// ch[s-1]=(char *)realloc(*ch,s *sizeof(char*));
}
uj5u.com熱心網友回復:
先自頂一下,上面的運行結果是洗掉第二個位置的x(洗掉前是 1 x 2 3,洗掉后的結果是 1 2 (null)3)
uj5u.com熱心網友回復:
洗掉后,將當前陣列索引記錄下來,并且從這個索引開始向后回圈,依次前移(ch[i - 1] = ch[i])一個元素,最后ch[i] = NULL即可。學生的難度,不難
uj5u.com熱心網友回復:
陣列是一個完整的記憶體塊,不能單獨的洗掉一行或者一列。但你可以重新申請一個內快,除去要被洗掉的行或列資料,將其他資料拷貝到新的記憶體塊里;最后洗掉原陣列uj5u.com熱心網友回復:
不應該是最后一個陣列為空嗎?為什么是洗掉位位空呢?uj5u.com熱心網友回復:
先把陣列的指標所指向的控制元件delete等釋放掉,然后再對陣列元素進行洗掉處理uj5u.com熱心網友回復:
設定斷點 單步除錯 看看是否是按你的思路走的uj5u.com熱心網友回復:
其實電腦開機后物理記憶體的每個位元組都是可讀寫的,從來不會因為所謂的new、delete或malloc、free而被創建、銷毀。區別僅在于作業系統記憶體管理模塊在你讀寫時是否能發現并是否采取相應動作而已。作業系統管理記憶體的粒度不是位元組而是頁,一頁通常為4KB。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/109632.html
標籤:基礎類
上一篇:Win32 API檔案
