Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过C语言中的方法动态分配和填充变量_C_Pointers_Dynamic Arrays - Fatal编程技术网

通过C语言中的方法动态分配和填充变量

通过C语言中的方法动态分配和填充变量,c,pointers,dynamic-arrays,C,Pointers,Dynamic Arrays,我在使用指针方面有很大的困难。在我看来,我试图完成的事情相当简单:我想定义一个多维字符数组,但不是它的大小,然后让第二种方法分配必要的内存,并用请求的数据填充它 现在,我已经尝试了无数个小时来完成这个任务,用谷歌搜索,直到我的眼睛干了,我仍然无法修复它。因此,我希望你们中的任何人都能洞察到这是如何可能的 我想象的是,定义一个指针char**files,以及一个计数器int total_files,它将用于我的方法print_files()。打印文件将调用变量的calloc和malloc,然后我们

我在使用指针方面有很大的困难。在我看来,我试图完成的事情相当简单:我想定义一个多维字符数组,但不是它的大小,然后让第二种方法分配必要的内存,并用请求的数据填充它

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

我想象的是,定义一个指针
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;
}
#定义_SVID_源
#包括
#包括
#包括
#包括
#包括
整数打印文件(字符***文件,整数*总计文件){
int size=10;
**files=calloc(size,sizeof(char*));
对于(int i=0;i
char**ppchar;
int x;
int-y;
ppchar=(char**)malloc(sizeof(char*)*100);
对于(x=0;x<100;x++){
ppchar[x]=(char*)malloc(sizeof(char)*100);
}
对于(x=0;x<100;x++){
对于(y=0;y<100;y++){
ppchar[x][y]=rand()%255;//ascii范围
}
}
对于(x=0;x<100;x++){
对于(y=0;y<100;y++){
//字符-128到127或0到255-主要是机器
//这会告诉你的。
printf(“%d\t”,ppchar[x][y]);
}
}
//确保清除内存
对于(x=0;x<100;x++){
自由(ppchar[x]);
}
免费(ppchar);
返回0;
}
char**ppchar;
int x;
int-y;
ppchar=(char**)malloc(sizeof(char*)*100);
对于(x=0;x<100;x++){
ppchar[x]=(char*)malloc(sizeof(char)*100);
}
对于(x=0;x<100;x++){
对于(y=0;y<100;y++){
ppchar[x][y]=rand()%255;//ascii范围
}
}
对于(x=0;x<100;x++){
对于(y=0;y<100;y++){
//字符-128到127或0到255-主要是机器
//这会告诉你的。
printf(“%d\t”,ppchar[x][y]);
}
}
//确保清除内存
对于(x=0;x<100;x++){
自由(ppchar[x]);
}
免费(ppchar);
返回0;
}
这假设不仅
文件
指向有效内存,而且该内存中的值也是指向指针的有效指针,指针将被更改

问题是

char** files;
...
print_files(&files, &num_files);
&files
是有效的指针,但是
(**(&files))
(由
打印文件
解除引用)是非法的遵从,因为
文件
尚未初始化

打印文件
行可能应为

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

这也有一个问题

*files[i] = malloc(sizeof(char) * 100);
这相当于

*(files[i]) = malloc(sizeof(char) * 100);
我想你可能是说

(*files)[i] = malloc(sizeof(char) * 100);
这假设不仅
文件
指向有效内存,而且该内存中的值也是指向指针的有效指针,指针将被更改

问题是

char** files;
...
print_files(&files, &num_files);
&files
是有效的指针,但是
(**(&files))
(由
打印文件
解除引用)是非法的遵从,因为
文件
尚未初始化

打印文件
行可能应为

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

这也有一个问题

*files[i] = malloc(sizeof(char) * 100);
这相当于

*(files[i]) = malloc(sizeof(char) * 100);
我想你可能是说

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

以下是一个工作版本:

#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;
}
valgrind
说“像筛子一样泄漏”,但在分配内存时不会滥用内存

什么改变了

三分球很可怕。但是,您只希望在
calloc()
的赋值中使用一级间接寻址。(对于双
*
,GCC警告说
main()
中的
文件未初始化!)然后,在循环内部,
(*文件)
周围的括号也很关键。
sprintf()
只是用来初始化新分配的字符串


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

这里有一个工作版本:

#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;
}
valgrind
说“像筛子一样泄漏”,但在分配内存时不会滥用内存

什么改变了

三分球很可怕。但是,您只希望在
calloc()
的赋值中使用一级间接寻址。(对于双
*
,GCC警告说
main()
中的
文件未初始化!)然后,在循环内部,
(*文件)
周围的括号也很关键。
sprintf()
只是用来初始化新分配的字符串


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

感谢您提供了一个简短、简单且好的答案。这正是我在谷歌上寻找的。它告诉了我什么地方出了问题,为什么出了问题,以及我如何解决它:)谢谢你给我一个简短、简单、好的回答。这正是我在谷歌上寻找的。它告诉我出了什么问题,为什么出了问题,以及我如何解决:)