使用矩阵时的 Sprintf

Sprintf in when using matrixes

提问人:Matheus Diógenes Andrade 提问时间:8/30/2023 最后编辑:Vlad from MoscowMatheus Diógenes Andrade 更新时间:8/30/2023 访问量:57

问:

我正在尝试在下面的代码中运行该函数,但它给出了,不知道为什么。sprintfsegfault

#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;
}

在行中显示。它适用于常规数组,但对于矩阵则失败。segfaultsprintf(vparam[0], "%s %s", vparam_keys[0], vparam_values[0]);

谢谢和问候。

c 多维数组 分割-故障 malloc 动态内存分配

评论

3赞 PaulMcKenzie 8/30/2023
你真正用的是什么语言?是 C 还是 C++?
2赞 Sam Varshavchik 8/30/2023
您能否将手指指向所示代码中分配足够内存的实际行?这是一个技巧问题,显示的代码中没有这样的行。因此崩溃了。vparam[0]
2赞 tadman 8/30/2023
尽管有许多相反的断言,但 C 和 C++ 不是同一种语言。在 C++ 中,你有很多这样的代码直接被扔进垃圾桶,因为有更好的方法。在 C 语言中,你就没有那么幸运了。std::stringstd::vector
4赞 tadman 8/30/2023
sprintf变成字符串常量是崩溃的好方法。 不可写。 是可写的,但不是。vparam[0]char a[80]""
3赞 Weather Vane 8/30/2023
...不仅如此,甚至没有分配足够的字节,所以即使它是可写的,其他东西也会被损坏。vparam[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]vparamchar **

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完全没有。我们,初学者,应该互相帮助:)