为什么会出现这种故障?
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 访问权限。
我在 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 访问权限。