通过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()
代码。感谢您提供了一个简短、简单且好的答案。这正是我在谷歌上寻找的。它告诉了我什么地方出了问题,为什么出了问题,以及我如何解决它:)谢谢你给我一个简短、简单、好的回答。这正是我在谷歌上寻找的。它告诉我出了什么问题,为什么出了问题,以及我如何解决:)