尝试将strcpy()用于2D char数组时出现分段错误?

时间:2015-02-13 01:28:45

标签: c arrays segmentation-fault strcpy

我尝试编写一个函数,该函数接收两个字符串,连接它们,然后将它们写入2D数组。我一直在搞乱不同的事情,看其他帖子都无济于事。当我试图将连接字符串写入char数组时,seg错误似乎发生在最后一个strcpy中。如果该行被注释掉,该程序似乎工作正常。

void saveToArray(char *command1, char *command2)
{
    char *saveCommands[30][100];
    int *commands = malloc(sizeof(int));
    char concatCommand[30];

    strcpy(concatCommand, command1);
    strcat(concatCommand, " ");
    strcat(concatCommand, command2);
    strcpy(*&saveCommands[0][*commands], concatCommand);
    *commands += 1;
}

我提前为任何格式问题道歉,因为这是我的第一篇文章,感谢任何答案!

2 个答案:

答案 0 :(得分:1)

此功能中有许多可怕的事情发生。首先......

int *commands = malloc(sizeof(int));

你不能释放它或返回它,所以它是100%的内存泄漏。我认为没有理由要在堆上而不是堆栈上分配这个整数。

char concatCommand[30];

strcpy(concatCommand, command1);
strcat(concatCommand, " ");
strcat(concatCommand, command2);

这可能会使您的缓冲区溢出。

strcpy(*&saveCommands[0][*commands], concatCommand);

*&安培;是一个无操作(它没有做任何事情)。你不能将任何东西复制到命令中,所以*命令可以是任何东西。最后,saveCommands中的指针没有被初始化,因此strcpy(saveCommands [x] [y],"某些字符串")在实践中基本上总是会出现段错误。我想你可能会想要这个:

char saveCommands[30][100]
...
strcpy(&saveCommands[0][*commands], concatCommand);

答案 1 :(得分:0)

我冒昧地重新编写了你的​​代码......太多的角色让我的眼睛受伤......无论如何,这段代码都有效。主要是引起这个问题的strcpy dereference。

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

void cmds(char *c1, char *c2) {
    char  sc[30][100];
    int   c = 0;
    char  cc[30];

    strcpy(cc,  c1);
    strcat(cc, " ");
    strcat(cc,  c2);
    strcpy(&sc[c][0], cc); // problem was here...
    printf("%s\n", &sc[c][0]);
}

int main() {
    char *c1 = "c001";
    char *c2 = "c002";

    cmds(c1, c2);
    return 0;
}