注册 登录
编程论坛 C语言论坛

malloc失败搞不定了

udefine 发布于 2022-03-07 21:23, 1365 次点击
想把命令行参数保存在全局变量中,在其他地方用,结果有注释的一行会在malloc是失败,怎么回事啊?

程序代码:

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

static int argnum;
static char **argstrs;

int main(int argc, char *argv[])
{
    argnum = argc;
    argstrs = (char **)malloc((argc-1)*sizeof(char *));
    int k;
    for (k = 1; k < argc; k++) {
        int j=k-1;
        char *str = argv[k];
        int slen = strlen(str);
        printf("%d: %s\t\t%d\n",k,str,slen);
        char *nstr=(char *)malloc(slen*sizeof(char));//传4个参数,最后一次此行会分配内存失败,不知道为什么
        
//printf("%s\n", nstr);
        strcpy(nstr, str);
        *(argstrs+j)=nstr;
    }
    return 0;
}
3 回复
#2
不会游泳的虾2022-03-08 09:07
修改如下,供参考:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int argnum;
static char** argstrs;
int main(int argc, char* argv[])
{
    argnum = argc;
    argstrs = (char**)malloc((argc - 1) * sizeof(char*));
    int k;
    for (k = 1; k < argc; k++) {
        int j = k - 1;
        char* str = argv[k];
        int slen = strlen(str);
        printf("%d: %s\t\t%d\n", k, str, slen);
        char* nstr = (char*)malloc(slen * sizeof(char));//传4个参数,最后一次此行会分配内存失败,不知道为什么
        
//printf("%s\n", nstr);
        strcpy(nstr, str);
        argstrs[j] = (char*)malloc(slen * sizeof(char));//修改
        *(argstrs + j) = nstr;
        printf("%s\n", argstrs[j]);
    }
    return 0;
}
#3
rjsp2022-03-08 12:35
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int argnum;
static char** argstrs;

int main( int argc, char* argv[] )
{
    argnum = argc;
    argstrs = malloc( (argc-1)*sizeof(char*) );

    for( int k=1; k<argc; ++k )
    {
        char* str = argv[k];
        size_t slen = strlen(str);
        printf( "argv[%d]: %s\t\t,length=%zu\n", k, str, slen );

        char* nstr = malloc( (slen+1)*sizeof(char) );
        strcpy( nstr, str );
        printf( "%s\n", nstr );
        argstrs[k-1] = nstr;
    }
}
#4
udefine2022-03-08 14:54
确实是少分配了一字节内存,slen+1后就好了
1