CC++ - 动态数组

    技术2026-08-29  5

    一、C++二维数组 - 动态分配、释放

    1、第一维、第二维均未知

    #include <iostream> #include <memory.h> using namespace std; int main() { int rows, cols; cout << "请输入二维数组行数:"; cin >> rows; cout << "请输入二维数组列数:"; cin >> cols; // 分配 int** a = new int* [rows]; for (int i = 0; i < rows; i++) { a[i] = new int [cols]; } // 置零 for (int i = 0; i < rows; i++) { memset(a[i], 0, cols * sizeof(int)); } // 遍历 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { cout << a[i][j] << " "; } cout << endl; } // 释放 for (int i = 0; i < rows; i++) { delete [] a[i]; } delete [] a; return 0; }

    2、第一维已知

    #include <iostream> #include <memory.h> using namespace std; const int rows = 3; int main() { int cols; cout << "请输入二维数组列数:"; cin >> cols; // 分配 int* a[rows]; for (int i = 0; i < rows; i++) { a[i] = new int[cols]; } // 置零 for (int i = 0; i < rows; i++) { memset(a[i], 0, cols * sizeof(int)); } // 遍历 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { cout << a[i][j] << " "; } cout << endl; } // 释放 for (int i = 0; i < rows; i++) { delete [] a[i]; } return 0; }

    3、第一维已知(内存连续)

    #include <iostream> #include <memory.h> using namespace std; const int rows = 3; int main() { int cols; cout << "请输入二维数组列数:"; cin >> cols; // 分配 int* a[rows]; a[0] = new int [rows * cols]; for (int i = 1; i < rows; i++) { a[i] = a[i - 1] + cols; } // 置零 /* for (int i = 0; i < rows; i++) { memset(a[i], 0, cols * sizeof(int)); }*/ memset(a[0], 0, rows * cols * sizeof(int)); // 内存连续 // 遍历 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { cout << a[i][j] << " "; } cout << endl; } // 释放 delete [] a[0]; return 0; }

    4、第二维已知(内存连续)

    #include <iostream> #include <memory.h> using namespace std; const int cols = 9; int main() { int rows; cout << "请输入二维数组行数:"; cin >> rows; // 分配 int (*a)[cols]; a = new int [rows][cols]; // 置零 /* for (int i = 0; i < rows; i++) { memset(a[i], 0, cols * sizeof(int)); }*/ memset(a, 0, rows * cols * sizeof(int)); // 内存连续 // 遍历 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { cout << a[i][j] << " "; } cout << endl; } // 释放 delete [] a; return 0; }

    二、C二维数组 - 动态分配、释放

    1、第一维、第二维均未知

    #include <stdio.h> #include <stdlib.h> #include <memory.h> int main() { int rows, cols; printf("请输入二维数组行数:"); scanf("%d", &rows); //scanf_s("%d", &rows, sizeof(rows)); printf("请输入二维数组列数:"); scanf("%d", &cols); //scanf_s("%d", &cols, sizeof(cols)); // 分配 int** a = (int**)malloc(rows * sizeof(int*)); for (int i = 0; i < rows; i++) { a[i] = (int*)malloc(cols); } // 置零 for (int i = 0; i < rows; i++) { memset(a[i], 0, cols * sizeof(int)); } // 遍历 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", a[i][j]); } printf("\n"); } // 释放 for (int i = 0; i < rows; i++) { free(a[i]); } free(a); return 0; }

    2、第一维已知

    #include <stdio.h> #include <stdlib.h> #include <memory.h> const int rows = 3; int main() { int cols; printf("请输入二维数组列数:"); scanf("%d", &cols); //scanf_s("%d", &cols, sizeof(cols)); // 分配 int* a[rows]; for (int i = 0; i < rows; i++) { a[i] = (int*)malloc(cols * sizeof(int)); } // 置零 for (int i = 0; i < rows; i++) { memset(a[i], 0, cols * sizeof(int)); } // 遍历 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", a[i][j]); } printf("\n"); } // 释放 for (int i = 0; i < rows; i++) { free(a[i]); } return 0; }

    3、第一维已知(内存连续)

    #include <stdio.h> #include <stdlib.h> #include <memory.h> const int rows = 3; int main() { int cols; printf("请输入二维数组列数:"); scanf("%d", &cols); //scanf_s("%d", &cols, sizeof(cols)); // 分配 int* a[rows]; a[0] = (int*)malloc(rows * cols * sizeof(int)); for (int i = 1; i < rows; i++) { a[i] = a[i - 1] + cols; } // 置零 /* for (int i = 0; i < rows; i++) { memset(a[i], 0, cols * sizeof(int)); }*/ memset(a[0], 0, rows * cols * sizeof(int)); // 内存连续 // 遍历 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", a[i][j]); } printf("\n"); } // 释放 free(a[0]); return 0; }

    4、第二维已知(内存连续)

    #include <stdio.h> #include <stdlib.h> #include <memory.h> const int cols = 9; int main() { int rows; printf("请输入二维数组行数:"); scanf("%d", &rows); //scanf_s("%d", &rows, sizeof(rows)); // 分配 int(*a)[cols]; a = (int(*)[cols])malloc(rows * cols * sizeof(int)); // 置零 /* for (int i = 0; i < rows; i++) { memset(a[i], 0, cols * sizeof(int)); }*/ memset(a, 0, rows * cols * sizeof(int)); // 内存连续 // 遍历 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", a[i][j]); } printf("\n"); } // 释放 free(a); return 0; }

    三、C++三维数组 - 动态分配、释放

    第一维、第二维、第三维均未知

    #include <iostream> #include <memory.h> using namespace std; int main() { int x, y, z; cout << "请输入三维数组第一维长度:"; cin >> x; cout << "请输入三维数组第二维长度:"; cin >> y; cout << "请输入三维数组第三维长度:"; cin >> z; // 分配 int*** a = new int** [x]; for (int i = 0; i < x; i++) { a[i] = new int* [y]; for (int j = 0; j < y; j++) { a[i][j] = new int [z]; } } // 置零 for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { memset(a[i][j], 0, z * sizeof(int)); } } // 遍历 for (int i = 0; i < x; i++) { cout << "矩阵" << i + 1 << ":" << endl; for (int j = 0; j < y; j++) { for (int k = 0; k < z; k++) { cout << a[i][j][k] << " "; } cout << endl; } cout << endl; } // 释放 for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { delete [] a[i][j]; } delete [] a[i]; } delete [] a; return 0; }

    四、C三维数组 - 动态分配、释放

    第一维、第二维、第三维均未知

    #include <stdio.h> #include <stdlib.h> #include <memory.h> int main() { int x, y, z; printf("请输入三维数组第一维长度:"); scanf("%d", &x); //scanf_s("%d", &x, sizeof(x)); printf("请输入三维数组第二维长度:"); scanf("%d", &y); //scanf_s("%d", &y, sizeof(y)); printf("请输入三维数组第三维长度:"); scanf("%d", &z); //scanf_s("%d", &z, sizeof(z)); // 分配 int*** a = (int***)malloc(x * sizeof(int**)); for (int i = 0; i < x; i++) { a[i] = (int**)malloc(y * sizeof(int*)); for (int j = 0; j < y; j++) { a[i][j] = (int*)malloc(z * sizeof(int)); } } // 置零 for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { memset(a[i][j], 0, z * sizeof(int)); } } // 遍历 for (int i = 0; i < x; i++) { printf("矩阵%d:\n", i + 1); for (int j = 0; j < y; j++) { for (int k = 0; k < z; k++) { printf("%d ", a[i][j][k]); } printf("\n"); } printf("\n"); } // 释放 for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { free(a[i][j]); } free(a[i]); } free(a); return 0; }

    参考: C与C++中二维数组的动态分配内存方法 C++中的delete和delete[]的区别

    Processed: 0.014, SQL: 9