为什么会出现这种故障?

Why is this malfunctioning?

我在 C:

中有这个程序
#include <stdio.h>
#include <string.h>
#include <stdint.h>

typedef struct sl{
  int32_t length;
  int32_t* arr;
} Selector;

void somefunction(Selector* temp){
  temp->length = 10;
  temp->arr = (int32_t*)malloc(temp->length * sizeof(int32_t));

  for(int i=0; i<temp->length; i++){
    temp->arr[i] = i*i;
  }
}

int main () {
  Selector* sel;

  // Make changes to struct from other function
  somefunction(sel);

  // Print each element
  for(int i=0; i<sel->length; i++){
    printf("Content of index %d: %d\n",i,sel->arr[i]);
  }
  printf("\n");

  return(0);
}

我在 PowerShell 中 运行 使用:gcc .\stest.c; .\a.exe,它工作正常:

Content of index 0: 0
Content of index 1: 1
Content of index 2: 4
Content of index 3: 9
Content of index 4: 16
Content of index 5: 25
Content of index 6: 36
Content of index 7: 49
Content of index 8: 64
Content of index 9: 81

但如果我将 int main() 更改为:

int main () {
  Selector* sel;

  // Make changes to struct from other function
  somefunction(sel);

  // Print each element
  for(int i=0; i<sel->length; i++){
    printf("Content of index %d: %d\n",i,sel->arr[i]);
  }
  printf("\n");

  // ============= ADDED CODE BELOW ============= //
  // Change each element a bit
  for(int i=0; i<sel->length; i++){
    sel->arr[i] = sel->arr[i] + 10;
  }

  // Print each element again
  for(int i=0; i<sel->length; i++){
    printf("Content of index %d after change: %d\n",i,sel->arr[i]);
  }
  printf("\n");
  // ============= ADDED CODE ABOVE ============= //
  return(0);
}

突然出现段错误?为什么?我没有使用堆栈并重载它,我对小数组使用了 malloc,它不会像传递到函数中那样再次传递引用以使内存丢失之类的。为什么这不起作用?否则我该怎么办?

感谢评论中提供解决方案的人。

问题是由未定义的行为引起的,因为指针未设置为任何值。

  int main() {

  Selector sel;

  // Make changes to struct from other function
  somefunction(&sel);

  // Print each element
  for(int i=0; i<sel.length; i++){
    printf("Content of index %d: %d\n",i,sel.arr[i]);
  }
  printf("\n");

  // ============= ADDED CODE BELOW ============= //
  // Change each element a bit
  for(int i=0; i<sel.length; i++){
    sel.arr[i] = sel.arr[i] + 10;
  }

  // Print each element again
  for(int i=0; i<sel.length; i++){
    printf("Content of index %d after change: %d\n",i,sel.arr[i]);
  }
  printf("\n");
  // ============= ADDED CODE ABOVE ============= //
  return(0);
}

总结一下,为了后人和其他人 运行 遇到同样的问题:

  • 不要将“sel”设为指针。
  • 发送“sel”作为参考。
  • 相应地更改 member-variable 访问权限。