1

我是 C 的新手,我并不完全理解所有这些指针和内存分配的东西,如果我在概念上是错误的,很抱歉。我正在尝试访问字符串数组中的字符串元素,但字符串数组位于结构中,每次我尝试访问它时,我的程序都会崩溃。

当我尝试执行此 if 语句检查时出现错误

if (strcmp(functionList[holder].otherServers[i], "") == 0)

我只想检查结构数组(functionList [holder])中的当前结构元素是否为其字符串数组(otherServers [i])中的元素填充了一个空值。当它找到它的第一个空元素时,我要做的就是在字符串数组的索引中复制一个字符串(otherServers[i])

这是我的代码(注意:我取出了很多我认为与问题无关的代码)

struct function {
    char name[20];
    int parameterNumer;
    int canDo;
    //currently the system has a 10 server max. You can change this easily
    char *otherServers[10];    
};

//global scope variables
//currently the system has a 10 server max. You can change this easily
char *serverList[10];
struct function functionList[10] = {{"",0, 0, {}}};
int numberofOtherServers;

while(strcmp(functionList[i].name, "") != 0 && i != -1)
{            
    //if the function exist in the functionList already, then just add server to the functions list of capable servers
    if(strcmp(functionList[i].name, functionName) == 0 && functionList[i].parameterNumer == functionParam)
    {
        holder = i;
        //function found so go through the functions list of servers and add it to the list
        i = 0;
        while(i >= 0)
        {
            if(strcmp(functionList[holder].otherServers[i], "") == 0)
            {
                strcpy(functionList[holder].otherServers[i], serverHelloName);
                i = -1; //
            }
            if(i == 9)
            { //ran through entire list of all possible servers and couldnt find an empty slot
                printf("server list full, should allow more room for other servers");
                fflush(stdout);
                i = -1;
            }
        }
        printf("yay");
        fflush(stdout);
    }
    if(i == 9)
    { //ran through entire list of all possible functions and did not see an empty slot or there is no match
        printf("function list full so could not add, and there was no match for any functions");
        fflush(stdout);
        i = -1;
    }
    i++;
}
4

2 回答 2

1

您的代码未显示otherServers. 当您有一个字符指针数组时,例如otherServers,您需要为每个字符串分配内存,以便有一些东西可以指向。

这意味着您需要先检查指针点是否有效,然后才能执行此操作strcmp(),并且strcpy()

if(strcmp(functionList[holder].otherServers[i], "") == 0) {
    strcpy(functionList[holder].otherServers[i], serverHelloName);
    i = -1;
}

相反,此代码段将检查otherServers[i]尚未分配的内容,然后分配足够的内存来存储字符串:

if ( functionList[holder].otherServers[i] == NULL ) {
    // add one for the terminator
    functionList[holder].otherServers[i] = malloc(strlen(serverHelloName) + 1);

    // make sure the allocation worked
    if ( functionList[holder].otherServers[i] == NULL ) {
        // something went wrong so bail
        break;
    }
    strcpy(functionList[holder].otherServers[i], serverHelloName);
}

当您完成otherServers[]orfunctionList[]本身后,您需要释放之前分配的内存:

for ( i = 0; i < 10; i++ ) {

    if ( functionList[holder].otherServers[i] != NULL ) {
        free(functionList[holder].otherServers[i]);
        functionList[holder].otherServers[i] = NULL;
    }
}
于 2013-04-20T22:23:30.187 回答
1

最好在初始化程序中用 NUL 代替普通的 "":

struct function functionList[10] = {{{'\0'},0, 0, {}}};

要检查示例中的名称是否已分配,您只需取消引用它并检查 NUL 字符:

*functionList[i].name == '\0'

strcmp检查从提供的偏移量开始的 nul 字符(又名零终止符),如果找不到,将继续超出数组 - 导致未定义的行为,很可能是访问冲突,具体取决于此缓冲区的方式分配。

SpacedMonkey 击败了我,获得了有效答案的其余部分;您需要为字符串分配存储空间。默认情况下,指针只指向内存中的某个区域 - 您必须malloc在使用它之前手动分配它,并使用free.

于 2013-04-20T22:28:14.060 回答