Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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_String_Malloc_Command Line Arguments_Allocation - Fatal编程技术网

C 这是分配内存的正确方法吗?

C 这是分配内存的正确方法吗?,c,string,malloc,command-line-arguments,allocation,C,String,Malloc,Command Line Arguments,Allocation,我在别人的密码里发现了这个。。。我不知道它是否正确,因为即使它看起来是错的,它也能工作。有人能澄清一下这是不是正确的,为什么是这样,以及为什么它是有效的吗 简言之,我们希望将所有作为命令行提供的参数串联存储在一个字符串中 注意:每个字符串至少有1个字符 片段: 问题是: 此行目的地是否为\u string=mallocagc*sizeofchar;是否分配足够的内存来执行此操作 有人能解释清楚这是怎么回事吗?因为我把它理解为:它正在分配argc*1字节。然而,当您运行它并将参数复制到它时,它是有

我在别人的密码里发现了这个。。。我不知道它是否正确,因为即使它看起来是错的,它也能工作。有人能澄清一下这是不是正确的,为什么是这样,以及为什么它是有效的吗

简言之,我们希望将所有作为命令行提供的参数串联存储在一个字符串中

注意:每个字符串至少有1个字符

片段:

问题是:

此行目的地是否为\u string=mallocagc*sizeofchar;是否分配足够的内存来执行此操作

有人能解释清楚这是怎么回事吗?因为我把它理解为:它正在分配argc*1字节。然而,当您运行它并将参数复制到它时,它是有效的,有人能解释一下吗

此行目的地是否为\u string=mallocagc*sizeofchar; 是否分配足够的内存来执行此操作

不需要。您需要分配足够的内存。举个例子

#define BUFSIZE YOUR_EXPECTED_SIZE

destination_string = malloc((BUFSIZE) * sizeof(char));
例如,命令行:a.out foo bar

此行目的地是否为\u string=mallocagc*sizeofchar; 是否分配足够的内存来执行此操作

不需要。您需要分配足够的内存。举个例子

#define BUFSIZE YOUR_EXPECTED_SIZE

destination_string = malloc((BUFSIZE) * sizeof(char));
例如,命令行:a.out foo bar


不,说你的论点是foo-bar。这使得argc=2。在这种情况下,使用mallocargc*sizeofchar只为2个字符分配内存

argv是一个二维数组,因此argv**。您需要首先检查每个参数的长度,以便为它们分配内存

mallocargc*sizeofchar的功能:
argc是您传递的参数数。sizeofchar返回需要为char变量分配的字节数。所以你得到了马洛克。malloc在堆中分配该数量的字节。

否。假设您的参数是foo-bar。这使得argc=2。在这种情况下,使用mallocargc*sizeofchar只为2个字符分配内存

argv是一个二维数组,因此argv**。您需要首先检查每个参数的长度,以便为它们分配内存

mallocargc*sizeofchar的功能:
argc是您传递的参数数。sizeofchar返回需要为char变量分配的字节数。所以你得到了马洛克。malloc在堆中分配该数量的字节。

您的代码只适用于较短类型的参数,即-x。但是对于长类型的参数,即-list,它将失败

这就是你能做到的

int main(int argc, char **argv) {

    // Declaring a pointer to a string.
    char *desintation_string;
    int Arg_Size = 0;

    // Allocating enough memory to store all arguments concatenated.
    // argv[0] is path not argument given in command line
    for (int i=1, i <= argc, i++)
        Arg_Size += sizeof(argv[i]);

    destination_string = malloc(Arg_Size); 
    . . . 
}

您的代码只适用于较短类型的参数,即-x。但是对于长类型的参数,即-list,它将失败

这就是你能做到的

int main(int argc, char **argv) {

    // Declaring a pointer to a string.
    char *desintation_string;
    int Arg_Size = 0;

    // Allocating enough memory to store all arguments concatenated.
    // argv[0] is path not argument given in command line
    for (int i=1, i <= argc, i++)
        Arg_Size += sizeof(argv[i]);

    destination_string = malloc(Arg_Size); 
    . . . 
}


只要您接收的每个字符串都有一个字符@辛科特。。这不分配argc*1字节。。。如何足够存储所有参数的所有字符?还是我的假设错了?@Lion它做的正是你认为它做的。代码错了。阅读使用也可以,谢谢。。所以这是错误的。只要你收到的每一个字符串都有一个字符,你就必须确定@辛科特。。这不分配argc*1字节。。。如何足够存储所有参数的所有字符?还是我的假设错了?@Lion它做的正是你认为它做的。代码错了。阅读使用也可以,谢谢。。所以这是错误的。只是要确定。谁说1024就够了?@immibis我知道,但这只是个例子。是的,每次都不一样。。可能超过1024,谁知道呢。这不是唯一的例子,这个问题的关键是什么数字足够。如果问题是关于其他方面的,那么你可以以1024为例,说读者可以用更好的东西来代替它,但这个问题部分是关于1024。谁说1024就够了?@immibis我知道,但这只是个例子。是的,每次都不一样。。可能超过1024,谁知道呢。这不是唯一的例子,这个问题的关键是什么数字足够。如果问题是关于其他的,那么你可以用1024作为例子,说这取决于读者用更好的东西来代替它,但这个问题部分是关于1024的。啊,瞧,这就是我所想的。。。这很奇怪,因为当你试图复制dest_str中的参数时,它是有效的,即使是这样。知道为什么吗?这可能有效,但不安全。可能会起作用,因为此时任何其他程序都不使用分配内存旁边的内存地址。但是,如果某个东西开始使用该内存,那么该数据将在运行时丢失,因为它是OS认为可用的内存。@Lion调用malloc时,它返回一个指针,指向至少与请求的内存相同的内存,但对于小的分配,实际内存块通常比请求的大小大得多。因此,即使使用比请求的内存更多的内存总是一个坏主意,但这并不一定会导致立即崩溃。@user3386109谢谢您的解释。现在一切都清楚了。@TeshanShanukaJ在几乎任何现代操作系统上,您的程序都生活在自己的虚拟地址空间中,因此您无法通过任何方式损坏其他程序的数据
在记忆中写作。但是,可能发生的情况是,您可能会覆盖堆用于必要簿记的数据结构,或者覆盖堆提供给程序另一部分的下一个内存块。顺便说一句,sizeofchar的定义是1,因为sizeof返回的大小是以字符为单位的。。。这很奇怪,因为当你试图复制dest_str中的参数时,它是有效的,即使是这样。知道为什么吗?这可能有效,但不安全。可能会起作用,因为此时任何其他程序都不使用分配内存旁边的内存地址。但是,如果某个东西开始使用该内存,那么该数据将在运行时丢失,因为它是OS认为可用的内存。@Lion调用malloc时,它返回一个指针,指向至少与请求的内存相同的内存,但对于小的分配,实际内存块通常比请求的大小大得多。因此,即使使用比请求的内存更多的内存总是一个坏主意,但这并不一定会导致立即崩溃。@user3386109谢谢您的解释。现在一切都清楚了。@TeshanShanukaJ在几乎任何现代操作系统上,您的程序都生活在自己的虚拟地址空间中,因此您无法通过在内存中写入来损坏其他程序的数据。但是,可能发生的情况是,您可能会覆盖堆用于必要簿记的数据结构,或者覆盖堆提供给程序另一部分的下一个内存块。顺便说一下,sizeofchar的定义是1,因为sizeof以字符为单位返回大小。