我如何获得char *矩阵?

时间:2014-10-02 20:19:07

标签: c xcode matrix char

我试图用C语言获取char *矩阵,但是发生了运行时错误。以下代码显示了我是如何尝试这样做的。谁能告诉我哪里错了?为什么?我是C编程的新手,但我来自Java和PHP的世界。 提前感谢您的有趣和帮助

int rows = 10;
int cols = 3;

//I create rows
char *** result = calloc(rows, sizeof(char **));

//I create cols
for (int i = 0; i < cols; i++)
{
    result[i] = calloc(cols, sizeof(char *));
}

//Load values into the matrix
for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < cols; j++)
    {
        result[i][j] = (char *)malloc(100 * sizeof(char));
        if (NULL != result[i][j])
        {
            strcpy(result[i][j], "hello");
        }
    }
    printf("\n");
}

//Print the matrix
for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < cols; j++)
    {
        printf("%s\t", result[i][j]);
    }
    printf("\n");
}

Ps:我使用xCode和C99

此处发生运行时错误:

result[i][j] = (char *)malloc(100 * sizeof(char));

xCode回复我EXC_BAD_ACCESS

2 个答案:

答案 0 :(得分:1)

此:

for (int i = 0; i < cols; i++)
{
    result[i] = calloc(cols, sizeof(char *));
}

应该是这样的:

// -----------------here
for (int i = 0; i < rows; i++)
{
    result[i] = calloc(cols, sizeof(char *));
}

无关:Stop casting memory allocation functions in C。这样:

result[i][j] = (char*)malloc(100 * sizeof(char));

应该是这样的:

result[i][j] = malloc(100 * sizeof(char));

我发现这很奇怪,因为你正确地没有投射你的calloc结果。


替代版本:可变长度数组(VLA)

如果您的平台支持,您可以通过利用VLA来切断其中一个分配循环。如果完成,代码将减少为使用单个char*分配calloc的整个矩阵。例如:

int main()
{
    int rows = 10;
    int cols = 3;

    // create rows
    char *(*result)[cols] = calloc(rows, sizeof(*result));

    // load values into the matrix
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            result[i][j] = malloc(100 * sizeof(char));
            if (NULL != result[i][j])
            {
                strcpy(result[i][j], "hello");
            }
        }
        printf("\n");
    }

    //Print the matrix
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            printf("%s\t", result[i][j]);
        }
        printf("\n");
    }
}

答案 1 :(得分:0)

在第一个for循环中,您只为3行分配内存,并且您尝试在上一个循环中访问超过3行。