定义具有可变大小的CHAR指针

时间:2014-03-06 07:11:03

标签: c pointers

如何定义具有正确宽度或可变宽度的字符指针?

我的情景如下......

void processRa(int _raCount, char *raFile)
{
    char *command; // How to correctly define this variable ?
    sprintf(command, "somecomm -r %s -N%d-%d ", raFile, (_raCount - 1), (_raCount - 1));
    system(command);
}

在场景中,我定义了一个char指针commandcommand的大小取决于函数传递变量raFile和以下行的命令。

5 个答案:

答案 0 :(得分:3)

C中的

char*没有相关存储空间。这与fortran之类的语言不同,其中字符类型代表固定大小的字符串。您必须使用char command[size+1]之类的内容定义字符数组,或者使用malloc()进行分配(当您使用时不要忘记调用free()完成字符串)。

棘手的部分是正确计算所需的长度。但是,在POSIX-2008标准中,已经存在一个名为asprintf()的函数,它正是您所需要的:它结合了sprintf()的功能和使用malloc()分配足够的内存(再次,不要忘记在完成字符串时调用free())。用法如下:

void processRa(int _raCount, char *raFile) {
    char *command; // How to correctly define this variable ?
    asprintf(&command, "somecomm -r %s -N%d-%d ", raFile, (_raCount - 1), (_raCount - 1));
    system(command);
    free(command);
}

答案 1 :(得分:1)

动态分配:

char *command = malloc(strlen(raFile) + N));

其中N是目标字符串其余部分的最大可能长度(在您的情况下包括空终止符,静态文本和两个动态整数)。

答案 2 :(得分:1)

int raFileLen = strlen( raFileLen ) ;
int extraInfo = strlen( "somecomm -r -N" ) + (sizeof(int)*2) + raFileLen + 10 ; 
// 10 bytes:: just to be safe

char* command = malloc( extraInfo ) ;
if( command == NULL ) return -1 ;

// Codes .... Codes

free( command ) ;

答案 3 :(得分:1)

somecomm = 8
-r = 2
%s = strlen(raFile)
-N = 2
%d = max 10 digits = 10 * 2  = 20
spaces = 4 (the trailing space also included)
-----------------------------------
total = 37 (one for '\0') + strlen(raFile);
-----------------------------------

我会说malloc(37 + strlen(raFile));就足够了

答案 4 :(得分:0)

这应该适合你,我相信:

command = malloc(strlen(raFile)+someBytes);

当然我假设raFile为空终止。