使用矩阵时使用Sprintf

问题描述 投票:0回答:1

我尝试运行下面代码中的

sprintf
函数,但它给出
segfault
,不知道为什么。

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

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

    // works fine
    char a[80] = "";
    char * b = "INTER";
    char * c = "10";
    sprintf(a, "%s %s", b, c);

    // for matrix
    int nvparam;
    char **vparam_values, 
         **vparam_keys, 
         **vparam;

    //params
    nvparam   = 1;
    vparam = ( char ** ) malloc( nvparam * sizeof( char [80] ) );
    vparam_keys = ( char ** ) malloc( nvparam * sizeof( char * ) );
    vparam_values = ( char ** ) malloc( nvparam * sizeof( char * ) );

    vparam[0] = "";
    vparam_keys[0] = "ITER";
    vparam_values[0] = "10";

    // test
    printf("%s\n", vparam_keys[0]);
    printf("%s\n", vparam_values[0]);
    // FAILING ZONE BEGINS
    sprintf(vparam[0], "%s %s", vparam_keys[0], vparam_values[0]); // for matrix it fails
    // FAILING ZONE ENDS
    printf("%s\n", vparam[0]);

    return 0;
}

segfault
体现在
sprintf(vparam[0], "%s %s", vparam_keys[0], vparam_values[0]);
行中。它对于常规数组工作得很好,但对于矩阵却失败了。

谢谢和问候。

c multidimensional-array segmentation-fault malloc dynamic-memory-allocation
1个回答
0
投票

对于初学者来说,内存分配

vparam = ( char ** ) malloc( nvparam * sizeof( char [80] ) );

没有意义。如果你想分配一个二维数组,那么你应该这样写

char ( *vparam )[80] = malloc( nvparam * sizeof( char [80] ) );

或者如果编译器支持可变长度数组则

char ( *vparam )[80] = malloc( sizeof( char [nvparam][80] ) );

此声明之后

vparam[0] = "";

指针

vparam[0]
指向字符串文字。还有这个电话

sprintf(vparam[0], "%s %s", vparam_keys[0], vparam_values[0]); 

尝试更改指针指向的字符串文字,从而导致未定义的行为。

你可以写

char ( *vparam )[80] = malloc( nvparam * sizeof( char [80] ) );
char **vparam_keys = malloc( nvparam * sizeof( char * ) );
char **vparam_values = malloc( nvparam * sizeof( char * ) );

vparam_keys[0] = "ITER";
vparam_values[0] = "10";

sprintf(vparam[0], "%s %s", vparam_keys[0], vparam_values[0]); 
© www.soinside.com 2019 - 2024. All rights reserved.