Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么不';我的结构和数组不能工作吗?_C_Arrays_Pointers_Struct - Fatal编程技术网

C 为什么不';我的结构和数组不能工作吗?

C 为什么不';我的结构和数组不能工作吗?,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,我的config.h中有这个struct和函数: typedef struct { char *key; char *value; } configParam; void loadSettings(char fileName[], struct configParam *paramsReaded[], int *length, int *statusCode){ int i; for(i=0; i< *length; i++){ //I try wit

我的config.h中有这个
struct
和函数:

typedef struct {
char *key;
char *value;
} configParam;

void loadSettings(char fileName[], struct configParam *paramsReaded[], int *length, int *statusCode){ 
   int i;
   for(i=0; i< *length; i++){

          //I try with strcpy(paramsReaded[i]->key,"key_from_txt"); and neither work :/
    strcpy(paramsReaded[i].key,"key_from_txt");   // HERE DONT WORK
    strcpy(paramsReaded[i].value,"value_from_txt");  // HERE DONT WORK

   }
}

void initialization(configParam *paramsReaded){
  paramsReaded->key = (char *)malloc(sizeof(char));
  paramsReaded->value = (char *)malloc(sizeof(char));
}
我已经用各种方法尝试了strcpy,但是现在我认为main.c在初始化调用中可能有问题。有什么想法吗?

当你写作的时候

 paramsReaded->key = (char *)malloc(sizeof(char));
您正在分配一个字节的内存,这不足以包含整个字符串:

 strcpy(paramsReaded[i].key,"key_from_txt");
而是分配足够的字节(字符数+1)来保存结尾0

 paramsReaded->key = (char *)malloc(strlen("key_from_txt")+1);
还请注意,您似乎想要一个结构数组,因此需要对每个结构重复上述操作

for(i=0; i< *length; i++)
{
   strcpy(paramsReaded[i].key = strdup(yourkey);
   strcpy(paramsReaded[i].value = strdup(yourvalue);
} 
for(i=0;i<*length;i++)
{
strcpy(paramsreded[i].key=strdup(yourkey);
strcpy(paramsreded[i].value=strdup(yourvalue);
} 
其中,您的key和value是您想要复制的任何文本(strdup与malloc+strcpy相同)

当您编写时

 paramsReaded->key = (char *)malloc(sizeof(char));
您正在分配一个字节的内存,这不足以包含整个字符串:

 strcpy(paramsReaded[i].key,"key_from_txt");
而是分配足够的字节(字符数+1)来保存结尾0

 paramsReaded->key = (char *)malloc(strlen("key_from_txt")+1);
还请注意,您似乎想要一个结构数组,因此需要对每个结构重复上述操作

for(i=0; i< *length; i++)
{
   strcpy(paramsReaded[i].key = strdup(yourkey);
   strcpy(paramsReaded[i].value = strdup(yourvalue);
} 
for(i=0;i<*length;i++)
{
strcpy(paramsreded[i].key=strdup(yourkey);
strcpy(paramsreded[i].value=strdup(yourvalue);
} 

其中,您的密钥和值是您想要复制的任何文本(strdup与malloc+strcpy相同)

除了CyberSpock之外,我注意到的另一件事是

configParam*参数已删除[];


如果在声明时没有初始化数组元素,则需要给出数组元素的数量(这是一般的C概念)。

除了CyberSpock的答案之外,我还注意到一件事

configParam*参数已删除[];


如果在声明时没有初始化数组元素,则需要给出数组元素的数量(这是一般的C概念)。

您遇到的主要问题是没有为
结构本身分配空间,然后没有为
键和
值分配足够的内存

此外,始终检查分配是否成功。否则,您可能会出现未定义行为写入未分配给结构的内存的风险

最后,在分配内存时,您负责跟踪内存,并在完成后释放内存。下面是一个简短的代码示例:

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

/* provide some minimum size that will hold keys & values */
#define MAXS 32

typedef struct {
    char *key;
    char *value;
} configParam;

void loadSettings(char *fileName, configParam *paramsReaded, int *length, int *statusCode)
{ 
    strcpy (paramsReaded->key,"key_from_txt");     /* or just use strdup and do away */
    strcpy (paramsReaded->value,"value_from_txt"); /* with your initialization       */
}

void initialization(configParam *paramsReaded)
{
    paramsReaded->key = malloc (MAXS * sizeof (char));
    paramsReaded->value = malloc (MAXS * sizeof (char));

    /* always check your allocation succeeded */
    if (!paramsReaded->key || !paramsReaded->value) {
        fprintf (stderr, "error: memory allocation failed.\n");
        exit (EXIT_FAILURE);
    }
}

int main()
{   
    configParam *parametersReaded = malloc (sizeof *parametersReaded); /* allocate at least 1 */

    /* always check your allocation succeeded */
    if (!parametersReaded) {
        fprintf (stderr, "error: memory allocation failed.\n");
        return 1;
    }

    initialization (parametersReaded);

    char ruta[] = "config.txt";
    int length = 5;
    int statusCodeee = 0;

    loadSettings (ruta, parametersReaded,&length,&statusCodeee);

    // getchar();
    printf ("\n key  : %s\n value: %s\n\n", parametersReaded->key, parametersReaded->value);

    /* free allocated memory (note: checks are not required
       if you insure your pointers have not been freed earlier
       in your code.)  A simple free (pointer) will suffice. */
    if (parametersReaded->key) free (parametersReaded->key);
    if (parametersReaded->value) free (parametersReaded->value);
    if (parametersReaded) free (parametersReaded);

    return 0;
}
注意:不要对
malloc
的结果进行强制转换。这只会导致难以发现的错误。
paramsreded->key=malloc(MAXS*sizeof(char));
就足够了

检查内存泄漏/错误

如果您刚开始动态分配内存,请确保在windows上使用内存检查器(如
valgrind
或类似工具)确认内存使用情况。它们使用简单,只需运行代码即可。它们将确认您的内存读写不涉及错误(超出分配的空间写入)并确认已充分释放分配的所有内存:

$ valgrind ./bin/initstruct
==6475== Memcheck, a memory error detector
==6475== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==6475== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==6475== Command: ./bin/initstruct
==6475==

 key  : key_from_txt
 value: value_from_txt

==6475==
==6475== HEAP SUMMARY:
==6475==     in use at exit: 0 bytes in 0 blocks
==6475==   total heap usage: 3 allocs, 3 frees, 80 bytes allocated
==6475==
==6475== All heap blocks were freed -- no leaks are possible
==6475==
==6475== For counts of detected and suppressed errors, rerun with: -v
==6475== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

您遇到的主要问题是没有为
结构
本身分配空间,然后没有为
分配足够的内存

此外,始终检查分配是否成功。否则,您可能会出现未定义行为写入未分配给结构的内存的风险

最后,在分配内存时,您负责跟踪内存,并在完成后释放内存。下面是一个简短的代码示例:

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

/* provide some minimum size that will hold keys & values */
#define MAXS 32

typedef struct {
    char *key;
    char *value;
} configParam;

void loadSettings(char *fileName, configParam *paramsReaded, int *length, int *statusCode)
{ 
    strcpy (paramsReaded->key,"key_from_txt");     /* or just use strdup and do away */
    strcpy (paramsReaded->value,"value_from_txt"); /* with your initialization       */
}

void initialization(configParam *paramsReaded)
{
    paramsReaded->key = malloc (MAXS * sizeof (char));
    paramsReaded->value = malloc (MAXS * sizeof (char));

    /* always check your allocation succeeded */
    if (!paramsReaded->key || !paramsReaded->value) {
        fprintf (stderr, "error: memory allocation failed.\n");
        exit (EXIT_FAILURE);
    }
}

int main()
{   
    configParam *parametersReaded = malloc (sizeof *parametersReaded); /* allocate at least 1 */

    /* always check your allocation succeeded */
    if (!parametersReaded) {
        fprintf (stderr, "error: memory allocation failed.\n");
        return 1;
    }

    initialization (parametersReaded);

    char ruta[] = "config.txt";
    int length = 5;
    int statusCodeee = 0;

    loadSettings (ruta, parametersReaded,&length,&statusCodeee);

    // getchar();
    printf ("\n key  : %s\n value: %s\n\n", parametersReaded->key, parametersReaded->value);

    /* free allocated memory (note: checks are not required
       if you insure your pointers have not been freed earlier
       in your code.)  A simple free (pointer) will suffice. */
    if (parametersReaded->key) free (parametersReaded->key);
    if (parametersReaded->value) free (parametersReaded->value);
    if (parametersReaded) free (parametersReaded);

    return 0;
}
注意:不要对
malloc
的结果进行强制转换。这只会导致难以发现的错误。
paramsreded->key=malloc(MAXS*sizeof(char));
就足够了

检查内存泄漏/错误

如果您刚开始动态分配内存,请确保在windows上使用内存检查器(如
valgrind
或类似工具)确认内存使用情况。它们使用简单,只需运行代码即可。它们将确认您的内存读写不涉及错误(超出分配的空间写入)并确认已充分释放分配的所有内存:

$ valgrind ./bin/initstruct
==6475== Memcheck, a memory error detector
==6475== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==6475== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==6475== Command: ./bin/initstruct
==6475==

 key  : key_from_txt
 value: value_from_txt

==6475==
==6475== HEAP SUMMARY:
==6475==     in use at exit: 0 bytes in 0 blocks
==6475==   total heap usage: 3 allocs, 3 frees, 80 bytes allocated
==6475==
==6475== All heap blocks were freed -- no leaks are possible
==6475==
==6475== For counts of detected and suppressed errors, rerun with: -v
==6475== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

您没有为指针数组分配(
malloc
calloc
)空间:
configParam*parametersreded[]
我建议使用类似于
configParam**parametersreded=calloc(10,sizeof*parametersreded);
(或者您需要多少)还没有人提到的一个错误是
struct configParam
应该是
configParam
(或者,该结构应该定义为
struct configParam{
)这是因为没有人试图编译它,但发现了一个大错误:盯着它们看
:p
我怀疑显示的代码是否可以编译。这是问题吗?你不应该把函数放在头文件中。这是通往地狱的路!相反,你把声明(带有'extern'限定符)放在头文件中,把定义放在
.c
文件中(实现文件)。您没有为指针数组分配(
malloc
calloc
)空间:
configParam*parametersreded[]
我建议类似于
configParam**parametersreded=calloc(10,sizeof*parametersreded);
(或者您需要多少)还没有人提到的一个错误是
struct configParam
应该是
configParam
(或者,该结构应该定义为
struct configParam{
)这是因为没有人试图编译它,但发现了一个大错误:盯着它们看
:p
,我怀疑显示的代码是否可以编译。这就是问题所在吗?你不应该将函数放入头文件中。这是通往地狱的路!相反,你将声明放入