尝试在struct中到达指针时失败

时间:2016-01-13 10:48:58

标签: c pointers struct dynamic-memory-allocation

我的项目是构建图书结构 - 并用用户参数填充。

涉及动态分配,数组和指针。

我的book结构具有以下内容:

struct BOOK
{
    char* author;
    char** genders;
    int totalGenders;
    char* name;
    int* chapterPages;
    int totalChapters;

}typedef book;

当我尝试到达作者姓名时,结构中的第1行:

struct BOOK
{
    char* author;

我做错了..我的代码在main:

int main()
{
    book* b;
    char authorChar[10] = { 0 };
    int authorLen;
    char* authorName;


    // get author name
    puts("please enter the name of the author");
    scanf("%s", &authorChar);
    authorLen = strlen(authorChar);
    printf("%d", authorLen);    //print to see that lentgh is correct.

    authorName = (char*)calloc(authorLen, sizeof(char));
    strcpy(authorName, authorChar);
    puts("\n");
    b->author = authorName;

    printf("%d", b->author);

当我调试时,我遇到了问题:

b->author = authorName;

想法好吗? :)

2 个答案:

答案 0 :(得分:3)

问题出在以下一行

<plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <shadedArtifactAttached>false</shadedArtifactAttached>
                        <createDependencyReducedPom>true</createDependencyReducedPom>
                        <relocations>
                            <relocation>
                                <pattern>com.fasterxml.jackson</pattern>
                                <shadedPattern>mypackage.com.fasterxml.jackson</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>

此时, b->author = authorName; 未分配内存,即b是未初始化的指针。它指向一些随机内存位置,它不是有效。任何访问无效内存的尝试都会调用undefined behavior

您可以使用以下任一方法解决此问题:

  • 在使用之前动态地将内存分配给b,例如b并检查是否成功。

  • b = malloc(sizeof*b);定义为b类型的变量,而不是指向类型的指针。

尽管如此,book至少应为int main(),以符合标准。

答案 1 :(得分:1)

您忘记为b变量进行内存分配。

b = malloc(sizeof(book));
b->author = malloc(sizeof(100000)); // replace value for the size you want