进程在malloc期间结束,退出代码为11 |错误

进程在malloc期间结束,退出代码为11 |错误,c,malloc,C,Malloc,试图理解C语言中的内存分配。在尝试使用指向整数的指针创建两个数组时面临问题。请查看以下代码: #include <stdio.h> #include <stdlib.h> int main() { int *a; int *b; for (int i = 0; i<4;i++) { printf("Enter value \n"); a[i]=(int *)malloc(sizeof(int));

试图理解C语言中的内存分配。在尝试使用指向整数的指针创建两个数组时面临问题。请查看以下代码:

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

int main() {

    int *a;
    int *b;

    for (int i = 0; i<4;i++)
    {
        printf("Enter value \n");
        a[i]=(int *)malloc(sizeof(int));
        b[i]=(int *)malloc(sizeof(int));
        scanf("%d",&a[i]);
        scanf("%d",&b[i]);
    }
    for (int i =0;i<4;i++)
    {
      printf("%d = %x\n  ",a[i],&a[i]);

    }
    for (int i =0;i<4;i++)
    {
     printf("%d = %x\n  ",b[i],&b[i]);

    }

    return 0;
}
b在调试期间显示为空

更新: 在另一个IDE上尝试,其中未分配任何内存。它直接给了我分段错误

更新2: 更改:

int *a;
int *b;


至少停止此代码的行为。当我试图将内存分配给一个[I]时,它就给我带来了分段错误,这是错误的,现在我得到了。

虽然代码确实为四个int值分配内存,但它并没有像您期望的那样工作

如果我们从头开始:

int *a;
这定义并声明了一个变量a,它是指向int的指针。您不初始化它,这意味着它的值是不确定的,看起来完全是随机的。将其与例如a[i]解除引用将导致

然后

如果必须使用指针和动态分配,则为四个int元素分配足够的内存,并指向第一个字节:

int *a = malloc(sizeof(int) * 4);

for (int i = 0; i<4;i++)
{
    printf("Enter value \n");
    scanf("%d",&a[i]);  // No allocation needed, a[i] already exists
}

还有一些其他问题,但从这些问题开始。

虽然代码确实为四个int值分配了内存,但它并没有像您预期的那样工作

如果我们从头开始:

int *a;
这定义并声明了一个变量a,它是指向int的指针。您不初始化它,这意味着它的值是不确定的,看起来完全是随机的。将其与例如a[i]解除引用将导致

然后

如果必须使用指针和动态分配,则为四个int元素分配足够的内存,并指向第一个字节:

int *a = malloc(sizeof(int) * 4);

for (int i = 0; i<4;i++)
{
    printf("Enter value \n");
    scanf("%d",&a[i]);  // No allocation needed, a[i] already exists
}

还有一些其他问题,但从这些问题开始。

您需要添加这些行,因为您需要创建内存,以便以后可以分配值:

  int **a = (int **)malloc(sizeof(int *) * 4);
  int **b = (int **)malloc(sizeof(int *) * 4);
您正在为a的元素指定指针值。因此,指针应该是指向指针的指针。 完整代码:

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

int main ()
{

  int **a = (int **)malloc(sizeof(int *) * 4);
  int **b = (int **)malloc(sizeof(int *) * 4);

  for (int i = 0; i < 4; i++)
    {
      printf ("Enter value \n");
      a[i] = (int *) malloc (sizeof (int));
      b[i] = (int *) malloc (sizeof (int));
      scanf ("%d", &a[i]);
      scanf ("%d", &b[i]);
    }
  for (int i = 0; i < 4; i++)
    {
      printf ("%d = %x\n  ", a[i], &a[i]);

    }
  for (int i = 0; i < 4; i++)
    {
      printf ("%d = %x\n  ", b[i], &b[i]);

    }

  return 0;
}

您需要添加这些行,因为您需要创建内存,以便以后可以分配值:

  int **a = (int **)malloc(sizeof(int *) * 4);
  int **b = (int **)malloc(sizeof(int *) * 4);
您正在为a的元素指定指针值。因此,指针应该是指向指针的指针。 完整代码:

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

int main ()
{

  int **a = (int **)malloc(sizeof(int *) * 4);
  int **b = (int **)malloc(sizeof(int *) * 4);

  for (int i = 0; i < 4; i++)
    {
      printf ("Enter value \n");
      a[i] = (int *) malloc (sizeof (int));
      b[i] = (int *) malloc (sizeof (int));
      scanf ("%d", &a[i]);
      scanf ("%d", &b[i]);
    }
  for (int i = 0; i < 4; i++)
    {
      printf ("%d = %x\n  ", a[i], &a[i]);

    }
  for (int i = 0; i < 4; i++)
    {
      printf ("%d = %x\n  ", b[i], &b[i]);

    }

  return 0;
}

您的代码中存在一些混乱:

您没有为要指向的a和b分配数组。a和b未初始化,取消引用它们具有未定义的行为。a在调试器中显示为NULL,但C标准不保证这一点。a可以有任何值,包括仅通过读取就会导致未定义行为的陷阱表示。 将指向int的指针存储到[i]:编译器应发出关于类型不匹配的诊断。不幸的是,这不是一个致命的错误,但忽略编译器警告总是一个坏主意。 malloc的返回值转换为int*。这在C++中是必需的,但是在C.被认为是坏的风格。 printf%d中的第三个参数=%x\n,a[i],&a[i];与转换说明符不一致:如果要以十六进制打印值,请使用printf%d=%x\n,a[i],a[i];,如果要打印地址,请使用%p转换说明符:printf%d位于%p\n,a[i],void*&a[i]; 要使用malloc,只需分配int数组,检查分配是否成功,并在使用后释放内存:

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

int main() {
    int *a;
    int *b;

    a = malloc(sizeof(*a) * 4);
    b = malloc(sizeof(*b) * 4);
    if (a == NULL || b == NULL) {
        fprintf(stderr, "cannot allocate memory\n");
        exit(1);
    }

    for (int i = 0; i < 4; i++) {
        printf("Enter 2 values\n");
        if (scanf("%d%d", &a[i], &b[i]) != 2) {
            fprintf(stderr, "invalid input\n");
            exit(1);
        }
    }
    for (int i = 0; i < 4; i++) {
        printf("  %d = %x\n", a[i], a[i]);
    }
    for (int i = 0; i < 4; i++) {
        printf("  %d = %x\n", b[i], b[i]);
    }
    free(a);
    free(b);
    return 0;
}

您的代码中存在一些混乱:

您没有为要指向的a和b分配数组。a和b未初始化,取消引用它们具有未定义的行为。a在调试器中显示为NULL,但C标准不保证这一点。a可以有任何值,包括仅通过读取就会导致未定义行为的陷阱表示。 将指向int的指针存储到[i]:编译器应发出关于类型不匹配的诊断。不幸的是,这不是一个致命的错误,但忽略编译器警告总是一个坏主意。 malloc的返回值转换为int*。这在C++中是必需的,但是在C.被认为是坏的风格。 printf%d中的第三个参数=%x\n,a[i],&a[i];与转换说明符不一致:如果要以十六进制打印值,请使用printf%d=%x\n,a[i],a[i];,如果要打印地址,请使用%p转换说明符:printf%d位于%p\n,a[i],void*&a[i]; 要使用malloc,只需分配int数组,检查分配是否成功,并在使用后释放内存:

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

int main() {
    int *a;
    int *b;

    a = malloc(sizeof(*a) * 4);
    b = malloc(sizeof(*b) * 4);
    if (a == NULL || b == NULL) {
        fprintf(stderr, "cannot allocate memory\n");
        exit(1);
    }

    for (int i = 0; i < 4; i++) {
        printf("Enter 2 values\n");
        if (scanf("%d%d", &a[i], &b[i]) != 2) {
            fprintf(stderr, "invalid input\n");
            exit(1);
        }
    }
    for (int i = 0; i < 4; i++) {
        printf("  %d = %x\n", a[i], a[i]);
    }
    for (int i = 0; i < 4; i++) {
        printf("  %d = %x\n", b[i], b[i]);
    }
    free(a);
    free(b);
    return 0;
}

a[i]=int*mallocsizeofint;:a没有指向任何地方。它没有初始化。您需要a=int*mallocsizeofint*4;。但还有其他问题。你也应该为指针分配内存。你需要回到你正在阅读的任何书籍或教程,仔细看看它告诉你关于指针和动态分配的信息。你所做的在很多层面上都是错误的。如果我从上面的代码中完全删除b,它会为数组a分配内存4个整数,并打印输入或扫描的值。只有当我尝试为另一个数组分配内存时,问题才会出现。您不应该强制转换malloc.a[I]=int*mallocsizeofint;:a没有指向任何地方。事实并非如此
初始化。您需要a=int*mallocsizeofint*4;。但还有其他问题。你也应该为指针分配内存。你需要回到你正在阅读的任何书籍或教程,仔细看看它告诉你关于指针和动态分配的信息。你所做的在很多层面上都是错误的。如果我从上面的代码中完全删除b,它会为数组a分配内存4个整数,并打印输入或扫描的值。只有在我尝试为另一个数组分配内存时,问题才会出现。您不应该强制转换malloc。在上一个程序中,scanf%d,&a[I];应替换为scanf%d,a[i];和printf%d=%x\n,a[i],&a[i];printf%d=%x\n,a[i][0],a[i][0];。正如您所说,为此分配内存是完全不必要的,并且会导致代码混乱。我认为没有必要分配指针数组?在上一个程序中,scanf%d,&a[I];应替换为scanf%d,a[i];和printf%d=%x\n,a[i],&a[i];printf%d=%x\n,a[i][0],a[i][0];。正如你所说,内存分配是完全没有必要的,并且会导致代码混乱。我认为没有必要分配指针数组?谢谢你的回答。我认为必须有其他方法来实施它。我只想分配内存,直到用户想退出程序。我只拿4个整数作为例子。例如,用户正在打字,在输入Q.@Manoj之前应该分配内存,然后阅读。谢谢您的回答。我认为必须有其他方法来实施它。我只想分配内存,直到用户想退出程序。我只拿4个整数作为例子。例如,用户正在打字,应该分配内存,直到他输入Q.@Manoj,然后阅读;它停止工作了。此外,如果我打印printf%p\n,*&a+1-*&a,则不带NULL;它打印可访问的尺寸,即0xFFFF000462FD622。谢谢@Manoj:int*a=NULL;,您的代码具有第一类未定义的行为:很容易发现,因为您直接取消了对空指针的引用,这会在大多数当前操作系统上导致分段错误。使用调试器运行时,很容易发现有问题的代码。带int*a;,代码有第三种未定义的行为:实际发生的情况取决于许多因素,包括外星人的影响。。。它可能不会立即崩溃,但谁知道可能触发了什么副作用。。。更难调试。只要我标记int*a=NULL;它停止工作了。此外,如果我打印printf%p\n,*&a+1-*&a,则不带NULL;它打印可访问的尺寸,即0xFFFF000462FD622。谢谢@Manoj:int*a=NULL;,您的代码具有第一类未定义的行为:很容易发现,因为您直接取消了对空指针的引用,这会在大多数当前操作系统上导致分段错误。使用调试器运行时,很容易发现有问题的代码。带int*a;,代码有第三种未定义的行为:实际发生的情况取决于许多因素,包括外星人的影响。。。它可能不会立即崩溃,但谁知道可能触发了什么副作用。。。更难调试。