0

我在使用指针时遇到了很大的困难。在我看来,我想要完成的声音相当简单:我想定义一个多维 char 数组,而不是它的大小,然后让第二种方法分配必要的内存,并用请求的数据填充它.

现在,我已经尝试了无数个小时来完成这个,用谷歌搜索,直到我眼睛干涩,我仍然无法修复它。因此,我希望你们中的任何人都知道这将如何成为可能。

我想象的是定义一个指针char** files,以及一个int total_files将用于我的方法的计数器print_files()。打印文件然后会 calloc 和 malloc 变量,然后我们将用相关数据填充它。

现在在下面的代码中,我尝试了这个;但是,在运行时,我只会收到非常详细的消息:“分段错误(核心转储)”。在使用 GDB 进行调试时,它指向:

 13  *files[i] = malloc(sizeof(char) * 100);

现在,这是针对 C 编程(适用于 Linux)的入门课程,您可能会在此处看到许多错误。不过,我愿意,谢谢你的时间。在没有方法/指针的情况下让代码工作没有任何问题,所以我确定我可能只是以某种方式混淆了语法。

#define _SVID_SOURCE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<dirent.h>
#include <time.h>

int print_files(char*** files, int* total_files) {
int size = 10;  
**files = calloc(size, sizeof(char *));
for(int i = 0; i < size; i++) {
    *files[i] = malloc(sizeof(char) * 100);
}
*total_files = size;
}

int main() {
char** files;
int num_files;
num_files = 0;
printf("-- Start print_files\n");

print_files(&files, &num_files);

printf("-- end print_files, number of files: %d\n", num_files);

for(int i = 0; i < num_files; i++)
    printf("Out: %s\n", files[i]);

printf("total_files=%d\n", num_files);

return 0;
}
4

3 回答 3

1
char **ppchar;
int x;
int y;

ppchar = (char**)malloc(sizeof(char*) * 100);
for (x = 0; x < 100; x++) {
    ppchar[x] = (char*)malloc(sizeof(char) * 100);
}

for(x = 0; x < 100; x++) {
    for(y = 0; y < 100; y++) {
        ppchar[x][y] = rand() % 255; // ascii range
    }
}

for(x = 0; x < 100; x++) {
    for(y = 0; y < 100; y++) {
        // char -128 to 127 or 0 to 255 - it's mostly machine
        // dependent.  This will tell you.
        printf("%d\t",ppchar[x][y]);
    }
}

//make sure to clean up the memory
for (x = 0; x < 100; x++) {
    free(ppchar[x]);
}

free(ppchar);

return 0;
}
于 2012-11-01T01:42:58.037 回答
1
**files = calloc(size, sizeof(char *));

这假设不仅files指向有效内存,而且该内存中的值也是指向将被更改的指针的有效指针。

问题是

char** files;
...
print_files(&files, &num_files);

&files是一个有效的指针,但是(**(&files))(由 取消引用print_files)是一个非法的引用,因为files没有被初始化。

print_files行可能应该是

*files = calloc(size, sizeof(char *));

.

也有问题

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

这相当于

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

我想你可能是说

(*files)[i] = malloc(sizeof(char) * 100);
于 2012-11-01T01:46:37.010 回答
1

这是一个工作版本:

#include <stdio.h>
#include <stdlib.h>

static void print_files(char ***files, int *total_files)
{
    int size = 10;  
    *files = calloc(size, sizeof(char *));
    for (int i = 0; i < size; i++)
    {
        (*files)[i] = malloc(sizeof(char) * 100);
        sprintf((*files)[i], "Line %d\n", i);
    }
    *total_files = size;
}

int main(void)
{
    char **files;
    int num_files;
    num_files = 0;
    printf("-- Start print_files\n");

    print_files(&files, &num_files);

    printf("-- end print_files, number of files: %d\n", num_files);

    for(int i = 0; i < num_files; i++)
        printf("Out: %s\n", files[i]);

    printf("total_files=%d\n", num_files);

    return 0;
}

输出是:

-- Start print_files
-- end print_files, number of files: 10
Out: Line 0
Out: Line 1
Out: Line 2
Out: Line 3
Out: Line 4
Out: Line 5
Out: Line 6
Out: Line 7
Out: Line 8
Out: Line 9
total_files=10

valgrind说“像筛子一样泄漏”,但在分配内存时不会滥用内存。

发生了什么变化?

三重指针很可怕。但是,您只想在分配中使用一级间接calloc()。(对于 double *,GCC 警告说filesinmain()未初始化!)然后,在循环内部,括号(*files)也很关键。sprintf()只是用来初始化新分配的字符串。

我没有main()显着更改代码。

于 2012-11-01T01:56:35.493 回答