繁体   English   中英

指向指针功能参数的指针

[英]Pointer to pointer function parameter

该函数应该只是读取一个矩阵。 我输入第一个字后为什么会冻结?

#include "stdafx.h"
#include <iostream>

using namespace std;

void as(char **p,int n,int m)
{
    int i, j;
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
        {
            cout << "p[" << i << "][" << j << "]=";
            cin >> p[i][j];
        }
}

int main()
{
    char *a[100];
    as(a, 3, 3);
    return 0;
}

这是未定义的行为:您的数组是一个包含100个char指针的数组。 但你从来没有初始化它们。 因此,当您解决p[i]它会获得一个未初始化的指针,该指针可以指向任何位置,当您使用p [i] [j]取消引用它时,您可能会冻结或遭受任何其他未定义行为的症状。

如果你想学习使用指针和数组:

解决方案1:将数组定义为char a[100][100];

解决方案2:在as()的外部循环中,开始用p[i] = new char[m];分配字符p[i] = new char[m];

如果你想学习现代C ++:

解决方案3:忘记内存分配和释放,改为使用向量。 向量是完全动态的,因此不再有最多100行:

void as(vector<vector<char>> &p, int n, int m)
{
    p.resize(n); 
    int i, j;
    for (i = 0; i < n; i++) {
        p[i].resize(m); 
        for (j = 0; j < m; j++)
        {
            cout << "p[" << i << "][" << j << "]=";
            cin >> p[i][j];
        }
    }
}

int main()
{
    vector<vector<char>>a;
    as(a, 3, 3);
    return 0;
}

如果你想在线试试......

解决方案4:你想要现代的C ++,但是你想使用a[]的元素,因为它们是一个字符串,为了便于输出和操作,只需使用与上面相同的代码,但替换vector<vector<char>>vector<string>

在这里,您可以在线查看略微简化的代码。

我有关于mallocs reallocs和指针的简单伪数组。 也许这对你很有意思:

typedef struct arr_str_t{
    size_t rows, columns;
    char **table;
}dynamicStringTable_t;

int CreateStringTable(dynamicStringTable_t **ptr, int rows, int columns)
{
    int result = 0;
    *ptr = (dynamicStringTable_t *)malloc(sizeof(dynamicStringTable_t));
    if (ptr == NULL) return - 1;
    (*ptr)->rows = rows;
    (*ptr)->columns = columns;
    (*ptr) -> table = (char *)malloc(rows * columns * sizeof(char *));
    if (*ptr == NULL)
    {
        free(*ptr);
        return -1;
    }
    for (int i = 0; i < rows * columns; i++) (*ptr)->table[i] = NULL;
    return 0;
}

char *getString(dynamicStringTable_t *ptr, int x, int y)
{
    char *result = (ptr == NULL || x >= ptr->columns || y >= ptr->rows || !x || !y) ? NULL : "";
    if (result != NULL)
    {
        result = ptr->table[x + y * ptr->rows];
    }
    return result;
}

int putString(dynamicStringTable_t *ptr, int x, int y, const char *str)
{
    int result = (ptr == NULL || x >= ptr->columns || y >= ptr->rows || str == NULL || !x || !y) * -1;
    if (!result)
    {
        char *tmp = (char *)realloc(ptr->table[x + y * ptr->rows], (strlen(str) + 1) * sizeof(char));
        if (tmp == NULL) result = -2;
        else
        {
            ptr->table[x + y * ptr->rows] = tmp;
            strcpy(tmp, str);
        }
    }
    return result;
}

int removeString(dynamicStringTable_t *ptr, int x, int y)
{
    int result = (ptr == NULL || x >= ptr->columns || y >= ptr->rows || !x || !y) * -1;

    if (!result)
    {
        free(ptr->table[x + y * ptr->rows]);
        ptr->table[x + y * ptr->rows] = NULL;
    }

        return result;
}

int destroyStringTable(dynamicStringTable_t *ptr, int x, int y)
{
    int result = (ptr == NULL || x >= ptr->columns || y >= ptr->rows || !x || !y) * -1;

    if (!result)
    {
        if (ptr->table != NULL)
        {
            for (int i = ptr->rows * ptr->columns - 1; i >= 0; i--)
                free(ptr->table[i]);
            free(ptr->table);
        }
        free(ptr);
    }
    return result;
}

您的代码中存在一个很大的问题。 你正面临着一个UB:

char *a[100]; // an array of 100 pointer to a character
// it is not initialized yet
  • 上面没有元素被初始化(甚至没有分配)。

要更正您的代码:

char *a[100];
// Allocating the array of 100 elements on the heap:
for(int i(0); i < 100; i++){
    a[i] = new char[100]; // let's say your array is n = m
}

as(a, 3, 3);

for(int i = 0; i < 3; i++){
    for(int j(0); j < 3; j++)
        cout << a[i][j] << ", ";
    cout << endl;
}

最后但并非最不重要的是当你完成动态数组时不要忘记释放内存:

for(int i = 0; i < 100; i++)
    delete[] a[i];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM