指针& C中的动态内存分配

时间:2013-11-10 17:31:32

标签: c malloc args

我对语言C相当陌生,而且我的指针和指针混乱不堪。动态内存分配。我要做的是读入命令行参数并将它们存储在动态内存分配中;然后将它们打印出来。例如,如果我输入./rpd 4 3 2 3 8,那么argv [1](4)应该递减,其他3个值(3,2,3,8)应该跟随。输出应如下所示:

人1有3辆车。 人2有2辆车。 人3有3辆车。 人4有8辆车。

我的代码是:

  #include <stdio.h>

int main(int argc, char *argv[]) {
    /** argc is number of arguments at command line*/
    /** argv[] is an array of pointers to character strings
        i.e. argv 1 points to argc 1 */
    int numberOfCars;
    char *person;
    int i;
    int j;

    // Allocate the size of the array for each element of char
    person = malloc(sizeof(numberOfCars) *argc);

    for(i = 2; i < argc; i++) {
        /** Convert char to int */
        numberOfCars = atoi(argv[i]);
        person = atoi(argv[1]);
        if(person > 0){
            for(j = 2; j < person; j--) {
                printf("Person %d has %d cars \n", person--, numberOfCars);
            }
        } else {
            /** DO NOTHING */
        }
    }
    return person;
}

如果这对我来说有点混乱(或天真),我很抱歉;但是我对这种语言非常陌生,所以我仍然试图了解一切。

非常感谢您的帮助:)

4 个答案:

答案 0 :(得分:1)

尝试这样的事情:

#include <stdio.h>

int main(int argc, char *argv[]) {
    /** argc is number of arguments at command line*/
    /** argv[] is an array of pointers to character strings
        i.e. argv 1 points to argc 1 */
    int numberOfCars;
    int i;

    for(i = 1; i < argc; i++) {
        /** Convert char to int */
        numberOfCars = atoi(argv[i]);
        printf("Person %d has %d cars \n", i, numberOfCars);
    }

    return 0;
}

然后根据您的需要调整它。您不需要为第一个输入参数指定人数,因为它是您为每个人指定的汽车数量所暗示的。

答案 1 :(得分:0)

atoi返回一个int,但person是一个char指针。

#include <stdio.h>
int main(int argc, char *argv[]) {
   /** argc is number of arguments at command line*/
   /** argv[] is an array of pointers to character strings
    i.e. argv 1 points to argc 1 */
   int numberOfCars;
   int i;
   int p = 0;
   for(i = 2; i < argc; i++) {
      /** Convert char to int */
      numberOfCars = atoi(argv[i]);
      printf("Person %d has %d cars \n", ++p, numberOfCars);
   }
   return 0;
}

输出:

$ ./a.out 4 3 2 3 8 10
 Person 1 has 3 cars 
 Person 2 has 2 cars   
 Person 3 has 3 cars 
 Person 4 has 8 cars 
 Person 5 has 10 cars

答案 2 :(得分:0)

代码

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

int main(int argc, char *argv[])
{
    int numberOfCars;
    int *person;
    int i;

    person = malloc(sizeof(int) * argc);

    for(i = 1; i < argc; i++)
    {
        numberOfCars = atoi(argv[i]);
        if (i == 1)
            numberOfCars--;
        person[i] = numberOfCars;
        printf("Person %d has %d cars\n", i, numberOfCars);
    }

    free(person);
    return 0;
}

示例输出

$ ./rpd 4 3 2 3 8
Person 1 has 3 cars 
Person 2 has 3 cars 
Person 3 has 2 cars 
Person 4 has 3 cars 
Person 5 has 8 cars
$

解释

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

您需要<stdlib.h>来声明malloc()free()。使用malloc()时,您还应使用free()

int main(int argc, char *argv[])
{
    int numberOfCars;
    int *person;
    int i;

变量j在修订版中未使用,因此已删除。变量person更改为int *,因为person[i]将存储i人的汽车数量。

    person = malloc(sizeof(int) * argc);

我将sizeof()更改为int;也可以使用sizeof(*person),并且有充分的理由选择它。

    for (i = 1; i < argc; i++)
    {
        numberOfCars = atoi(argv[i]);

作业person = atoi(argv[1]);在多个级别上都是错误的。它泄露了malloc()分配的内存;它为指针(最初为int)指定了char *

        if (i == 1)
            numberOfCars--;

这涉及'从第一个参数中减去一个'的要求。

        person[i] = numberOfCars;

记录人i拥有的汽车数量。没用过;可以在numberOfCars语句中使用它来代替printf()

        printf("Person %d has %d cars\n", i, numberOfCars);

一条线末端的空间是我的bêtenoire。不要把空格放在换行符之前。

    }

    free(person);

释放已分配的内存。在这个玩具程序中,它并不重要(o / s即将释放程序使用的所有资源),但如果它是一个大程序中的一个函数并且它省略了free(),它会每次调用时都会泄漏内存。养成在编写free()后立即为每个malloc()撰写malloc()的习惯。 (或者,至少,确保您知道在哪里编写free(),并且执行在编译之前编写free(),更不用说测试程序了。)

    return 0;
}

答案 3 :(得分:0)

您想要动态存储什么? 如果只想按照您提到的那样打印值。你根本不需要动态分配。

如果你想存储它们,请使用 char **人; //而不是* person,并使用

保持每个人的分配内存

person [i] = malloc(sizeof(argv [i])+ sizeof(“person have cars”)); //不确定您需要的格式存储,您可以相应地更改