我想我现在已经解决了所有问题。我犯了一个错误,就是增加environ变量,而不是把它当成一个数组并迭代它。以下是我现在所拥有的,应该是好的。
extern char **environ;
int main(int argc, char *argv[]) {
// determine number of environment variables
int n = 0;
char *c = NULL;
while ((c = environ[n++]) != NULL) {
printf("%s\n", c);
}
printf("%s\n%d\n\n", c, n);
// allocate array to store character pointers to environment array
char **new_c;
printf("This prints\n");
if ((new_c = malloc(n * sizeof(*c))) == NULL) {
printf("Error\n");
exit(EXIT_FAILURE);
}
printf("This prints now too\n");
free(c);
// sort array of character pointers
// parse each environment variable and output
exit(0);
}
首先,我读了几十本malloc& amp;这里的分段错误问题似乎与我的相同。话虽这么说,如果这是一个重复的问题,你会指导我解决方案吗?
大家好,我在使用malloc时遇到了问题。我编译并运行我的程序一次,malloc工作。然后我开始填写更多代码来解决问题,因为第一次运行我收到了分段错误。下面是我的代码在它的最后工作状态(尽管仍然给出了一个seg错误):
extern char **environ;
int main(int argc, char *argv[]) {
// determine number of environment variables
int n = 0;
char *c = *environ;
while ((c = *environ++) != NULL) {
n++;
printf("%s\n", c);
}
printf("%s\n%d\n\n", c, n);
// allocate array to store character pointers to environment array
printf("This prints\n");
if ((c = malloc((size_t) n)) == NULL) {
perror("Unable to allocate memory\n");
}
printf("This does not print\n");
free(c);
// sort array of character pointers
// parse each environment variable and output
exit(0);
}
该程序应该为char数组分配内存,然后根据FORMAT值的设置,它将用于排序,解析和打印名称 - 值或值 - 名称对。第一个循环工作并遍历environ变量并打印出每个名称 - 值对。我包含的两个printf语句陈述了我在终端中看到的内容。有没有人有任何想法我做错了什么?
另外,我尝试使用以下malloc行:
char *new_c = malloc((size_t) n);
char *new_c = malloc(n);
char *new_c = malloc(1);
char *new_c = malloc(sizeof(n));
int *ptr = malloc((size_t) n);
我可能会尝试其他一些但我仍然感到困惑。代码行很少,我不确定如何在早期就弄乱任何东西。另外,这里的咯咯笑是我在终端免费使用时得到的东西(显示我有内存):
total used free shared buff/cache available
Mem: 3036836 1404340 902852 104712 729644 1491248
Swap: 0 0 0
我也试过在if语句之外调用malloc:
c = malloc((size_t) n);
if (c == NULL) {
perror("Unable to allocate memory\n");
}
答案 0 :(得分:3)
您要修改全局environ
:
while ((c = *environ++) != NULL) {
在while循环之后,environ
指向未初始化的内存。
malloc()
查找一些可以修改其行为的环境变量,现在取消引用指向未初始化内存的指针。
使用此:
int i = 0;
while ((c = environ[i++]) != NULL) {
这应该可以解决分段错误。
答案 1 :(得分:1)
有两件事:
if ((c = malloc((size_t) n)) == NULL) {
perror("Unable to allocate memory\n");
}
您在这里分配n
个字节。听起来你想为n
的{{1}}指针分配空间,所以你应该替换为:
char
如果这确实是您尝试做的事情,那么malloc(n * sizeof(char *))
应该是c
,而不是char **
,最好仍然是:
char *
顺便说一下,您似乎正在使用c = malloc(n * sizeof *c)
来完成两件完全不同的事情。通常最好不要使用变量 - 因为它会使您的程序更难理解 - 而是使用一个变量循环来打印您的环境变量,而使用另一个变量来存储动态分配的数组。 / p>
此外,如果c
失败,则致电perror()
,但是您只需继续执行您的程序,就好像没有错误一样。实际上,你应该在报告之后通过调用malloc()
来回应这种性质的失败,如果没有其他的话。