strlen不会返回带有指向数组的指针的正确值

时间:2016-05-09 16:21:16

标签: c

我有以下代码:

char* realtor_command[120];
for(int i=0;i<REALTOR_MAX_COMMAND_LENGTH;i++){
    realtor_command[i]=malloc(sizeof(120));
}
realtor_command[0]="test_string"
realtor_command[1]="next_test_string"

当我使用strlen(realtor_command[0])时,我得到错误的值,我在之前的问题中读到这是因为它是一个数组而不是指针,但我还没有找到解决此问题的任何方法。

我的问题是,无论如何都要获得realtor_command[i]的长度?

非常感谢。

编辑:

这就是我调用strlen的方式:

char* matrix=malloc(strlen(realtor_command[8])+1);

1 个答案:

答案 0 :(得分:3)

在此代码中:

char* realtor_command[120];
for(int i=0;i<REALTOR_MAX_COMMAND_LENGTH;i++){
    realtor_command[i]=malloc(sizeof(120));
}

你创建了一个包含120个字符串的数组,然后遍历REALTOR_MAX_COMMAND个字符串(大概应该是120?)并将它们设置为新分配的4或8字节字符串(sizeof(120)表示{{ 1}}这是4或8字节)。由于这些字符串是新分配的,因此它们将包含任意数据,并且可能不会以空终止符结束。

这很重要,因为sizeof(int)只是循环遍历字符串,直到找到空终止符,因此它不能使用非空终止字符串。

你可以自己添加一个null终止符,但是字符串将包含直到字符串末尾的任意垃圾,并且它们内部可能有空终止符。你可以让它们以null终止符开头,但是strlen()总是会返回0。

更好的方法是在实际填充它们时分配这些字符串,并在此之前将它们保留为空指针:

strlen()

这也可以避免代码中的内存泄漏。

请注意,您可能希望确保fgets读取的字符串包含换行符,以确保输入适合您的缓冲区:

char* realtor_command[120];
for (int i = 0; i < 120; i++) {
    realtor_command[i] = NULL;
}

char input_buffer[REALTOR_MAX_COMMAND];

// Read in one string, then copy it so we can re-use the buffer
fgets(input_buffer, REALTOR_MAX_COMMAND, stdin);
realtor_command[0] = strdup(input_buffer);