我尝试运行下面代码中的
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]);
行中。它对于常规数组工作得很好,但对于矩阵却失败了。
谢谢和问候。
对于初学者来说,内存分配
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]);