问题描述
任何人都可以解释print()函数有什么问题吗?
printf(“ Control”)无效,输出为分段错误11
struct HomeView: View {
var body: some View {
NavigationView {
Text("Hello,World!")
.navigationTitle("Hello,World!")
.toolbar {
ToolbarItem(placement: .bottomBar) {
HStack {
Spacer()
Button(action: { print("pressed") }) {
Image(systemName: "plus.circle.fill")
.imageScale(.large)
.font(.title)
}
}
}
}
}
}
}
第一步:用值填充地址
import unittest
import pandas as pd
from unittest.mock import patch
from pandas.util.testing import assert_frame_equal
with patch('pandas.datetime.utcNow',return_value="2020-08-16 20:36:06.578174"):
actual = my_function()
expected = pd.DataFrame(data=[[1,"2020-08-16 20:36:06.578174"]],columns=['value','utc_timestamp'])
assert_frame_equal(actual,expected)
直到这里一切都还不错。 我遇到了细分错误:在下面的代码和“控件”行之后11永远无法工作
int main(int argc,char **argv){
int m=5,n=4; // matrix[5][4]
int a=50,b=20; // range: 20-50
int **matrix;
imatrix(matrix,m,n,a,b);
print(matrix,n);
解决方法
不是printf("control")
会引起段错误(尽管最好不要使用printf
:考虑将其更改为puts("control")
也会输出换行符。 )这是上一次打印矩阵的尝试,它取消引用了未初始化的值。
之所以会这样,是因为您的imatrix
函数没有返回它创建的矩阵,并且matrix
中的main
没有任何值。
实际上,imatrix
不会返回任何内容,因为它被定义为返回void
。它带有一个matrix
参数,我想这是一个输出参数,但是:
-
该参数的类型错误,使其成为输出参数(输出参数必须是要返回的对象的指针;
-
它从不尝试使用指向要返回的对象的指针来返回对象。
为了符合这些要求,您需要原型
void imatrix(int*** matrix,int m,int n,int max,int min);
对于每种matrix
的使用,您都必须添加一个间接级别[注1]:
*matrix = malloc(m * sizeof(**matrix));
if (*matrix == NULL) {
printf( "memory req.!" );
/* NOTE: You shouldn't attempt to continue after the malloc fails.
* Return immediately and let the caller deal with the malloc failure.
*/
}
for( i = 0; i < m; i++ ) {
(*matrix)[i] = malloc( n * sizeof(*(*matrix)[i])) );
if( (*matrix)[i] == NULL ){
// etc.
我认为我们可以同意,这是一个主要的PITA,除非有必要,否则不值得为此烦恼。
我个人认为,除非绝对必要,否则根本不使用输出参数会减少混乱。在这种情况下,根本没有必要,因为您只需返回指针即可分配内存:
/* CHANGE: Prototype */
int** imatrix(int m,int min){
srand(time(NULL)); /* TODO: This initialisation should really be done in main */
int i=0,j=0;
/* CHANGE: matrix is a local variable */
int** matrix = malloc( m * sizeof(*matrix) );
/* CHANGE: Immediate return on malloc failure */
if( matrix == NULL ) {
return matrix;
}
for( i = 0; i < m; i++ ) {
matrix[i] = malloc( n * sizeof(*matrix[i]) );
if( matrix[i] == NULL ){
printf( "memory req.!" );
}
}
for(i=0;i<m;i++){
for(j=0;j<n;j++){
matrix[i][j]=(rand()%(max-min))+min;
printf("%2d ",matrix[i][j]);
}
printf("\n\n");
}
/* CHANGE: matrix is returned */
return matrix;
}
使用方式略有不同:
int main(int argc,char **argv){
int m=5,n=4; // matrix[5][4]
int a=50,b=20; // range: 20-50
/* CHANGE: imatrix returns the new matrix */
int **matrix = imatrix(m,n,a,b);
/* CHANGE: check for failure */
if (matrix == NULL) {
fprintf(stderr,"%s\n","imatrix failed to allocate memory.");
exit(1);
}
print(matrix,m,n);
/* TODO: Free the storage allocated for matrix */
}
注释
-
在这段代码中,我从以下位置更改了malloc的用法:
lvalue = (RedundantCast*)malloc(count * sizeof(FixedType));
惯用的C:
lvalue = malloc(count * sizeof(*lvalue));
在C中,对返回值
malloc
的显式转换最多是毫无意义的,因为malloc
返回一个void*
并且C乐于自动将void*
转换为任何类型的指针。使用目标(sizeof(*lvalue)
指向的对象的类型而不是插入特定的类型,可以防止在将来的编辑中该类型会更改,并且您忘记了在所有对malloc
。 (例如,考虑如果您决定将matrix
做成long long
而不是int
的矩阵,会发生什么。)