提问人:Matheus Diógenes Andrade 提问时间:8/30/2023 最后编辑:Vlad from MoscowMatheus Diógenes Andrade 更新时间:8/30/2023 访问量:57
使用矩阵时的 Sprintf
Sprintf in when using matrixes
问:
我正在尝试在下面的代码中运行该函数,但它给出了,不知道为什么。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]);
谢谢和问候。
答:
1赞
Vlad from Moscow
8/30/2023
#1
对于初学者来说,这种内存分配
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]
vparam
char **
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]);
在本例中,表达式的字符数组类型为 。因此,调用的结果将与第一个代码片段中的结果相同。vparam[0]
char[80]
sprintf
评论
1赞
Vlad from Moscow
8/31/2023
@MatheusDiógenesAndrade完全没有。我们,初学者,应该互相帮助:)
评论
vparam[0]
std::string
std::vector
sprintf
变成字符串常量是崩溃的好方法。 不可写。 是可写的,但不是。vparam[0]
char a[80]
""
vparam[0] = "";